我的应用程序正在使用第三方应用程序来获取数据(Splunk)。 Splunks api端点返回的输出是一个包含所有行标题的Array和一个包含所有行数据的字符串数组。例如
{
"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中获得正确的逻辑。
一种简单的方法是将响应转换为具有fields
到List<String>
和rows
到List<List<String>>
的对象,然后您可以显示预期的结果,如下所示。
Class 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 Count”:“ 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“}