【问题标题】:JSON Combine Array with Array of Strings to get a cohesive name value pairJSON 将数组与字符串数组结合以获得一个有凝聚力的名称值对
【发布时间】:2019-12-23 16:20:57
【问题描述】:

我的应用程序正在使用第 3 方应用程序来获取数据 (Splunk)。 Splunks api 端点返回的输出是一个包含所有行标题的数组和一个包含所有行数据的字符串数组。例如

{
    "fields":[
        "appID",
        "ApplicationName",
        "AppOwner",
        "AppOwnerID",
        "KnownIPS",
        "IP Count",
        "KnownFIDS",
        "FIDCount",
        "LastSeen",
        "TotalConnections"],
    "rows":[
        [
            "123456",
            "HelloWorld",
            "Last,First",
            "E12345",
            "11.111.11.111,222.22.22.222",
            "2",
            "A67890,B12345,C67890",
            "3",
            "2019-12-08",
            "47937"
        ]
    ],
    "id":0
}

但是我希望我的输出类似于

{
    Field[0]:row[0],
    Field[1]:row[1],
    etc..
}

现在我可以使用以下方法在我的网页上显示结果

 try {

        ArrayList<String> fieldslist = new ArrayList<String>();

        JSONObject json = new JSONObject(responseString);
        JSONArray fields = json.getJSONArray("fields");

        JSONArray jsonArray = json.getJSONArray("rows"); // JSONArray is from the json.org library
        String[][] arrayOfArrays = new String[jsonArray.length()][];
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONArray innerJsonArray = (JSONArray) jsonArray.get(i);
            String[] stringArray = new String[innerJsonArray.length()];
            for (int j = 0; j < innerJsonArray.length(); j++) {
                stringArray[j] = (String) innerJsonArray.get(j);
            }
            arrayOfArrays[i] = stringArray;
        }



        if (fields != null) {
            int len = fields.length();
            for (int i=0;i<len;i++){
                fieldslist.add(fields.get(i).toString());

            }
        } ;

        appDetail.setFields(fieldslist);
        appDetail.setRows(arrayOfArrays);

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return appDetail;

还有我的模特

@JsonProperty("fields")
private List<String> fields = new ArrayList<String>();
@JsonProperty("rows")
private String[][] rows = new String[i][j];

@JsonProperty("fields")
public List<String> getFields() {
    return fields;
}

@JsonProperty("fields")
public void setFields(List<String> fields) {
    this.fields = fields;
}

public Model withFields(List<String> fields) {
    this.fields = fields;
    return this;
}

@JsonProperty("rows")
public String[][] getRows() {
    return rows;
}

@JsonProperty("rows")
public void setRows(String[][] rows) {
    this.rows = rows;
}

public Model withRows(String[][] rows) {
    this.rows = rows;
    return this;

我知道我必须更新我的模型才能正确显示正确的结果,但我似乎无法在 try catch 中获得正确的逻辑。

【问题讨论】:

  • 现在我可以显示结果了,那么你现在有什么问题?
  • 我能够以字段、行格式显示结果,但不能以字段[0]、行[0]等形式显示结果

标签: java json splunk


【解决方案1】:

一个简单的方法是将响应转换为fieldsList&lt;String&gt;rowsList&lt;List&lt;String&gt;&gt; 的对象,然后您可以显示预期的结果如下。

类 SplunkResponse

class SplunkResponse {
    private List<String> fields;
    private List<List<String>> rows;
    private int id;

    //general getters ans setters
}

代码片段

ObjectMapper mapper = new ObjectMapper();
SplunkResponse response = mapper.readValue(jsonStr, SplunkResponse.class);
Map<String, Object> resultMap = new HashMap<>();
for (int row = 0; row < response.getRows().size(); row++) {
    for (int idx = 0; idx < response.getRows().get(row).size(); idx++) {
        resultMap.put(response.getFields().get(idx), response.getRows().get(row).get(idx));
    }
}

System.out.println(mapper.writeValueAsString(resultMap));

控制台输出

{"IP 计数":"2","ApplicationName":"HelloWorld","AppOwner":"Last,First","KnownFIDS":"A67890,B12345,C67890","KnownIPS":"11.111. 11.111,222.22.22.222","appID":"123456","AppOwnerID":"E12345","FIDCount":"3","TotalConnections":"47937","LastSeen":"2019-12-08" }

【讨论】:

  • 这看起来可以解决我的问题!我离开了我的键盘一会儿。但如果适用,会尽快标记为答案!
  • @Sudosu0 您好,感谢您的评论,如果我的解决方案解决了您的问题,请告诉我?
  • 很抱歉耽搁了,假期出去了。这非常有效,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多