首页 > 解决方案 > JSON 将数组与字符串数组结合以获得一个有凝聚力的名称值对

问题描述

我的应用程序正在使用第 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 中获得正确的逻辑。

标签: javajsonsplunk

解决方案


fields一种简单的方法是使用toList<String>rowsto将响应转换为对象List<List<String>>,然后您可以显示预期结果如下。

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"}


推荐阅读