如何从JSON字符串获取指向值的所有JSON路径的列表?

我的目标是读取JSON文件并了解所有值的位置,以便在遇到相同JSON时可以轻松读取所有值。我正在寻找一种以Jayway

JsonPath格式返回包含每个数据值的所有路径的列表的方法。

JSON示例:

{

"shopper": {

"Id": "4973860941232342",

"Context": {

"CollapseOrderItems": false,

"IsTest": false

}

},

"SelfIdentifiersData": {

"SelfIdentifierData": [

{

"SelfIdentifierType": {

"SelfIdentifierType": "111"

}

},

{

"SelfIdentifierType": {

"SelfIdentifierType": "2222"

}

}

]

}

}

理想情况下,我想将JSON作为String并执行以下操作:

String json = "{'shopper': {'Id': '4973860941232342', 'Context': {'CollapseOrderItems': false, 'IsTest': false } }, 'SelfIdentifiersData': {'SelfIdentifierData': [{'SelfIdentifierType': {'SelfIdentifierType': '111'} }, {'SelfIdentifierType': {'SelfIdentifierType': '2222'} } ] } }";

Configuration conf = Configuration.defaultConfiguration();

List<String> jsonPaths = JsonPath.using(conf).parse(json).read("$");

for (String path : jsonPaths) {

System.out.println(path);

}

此代码将打印此内容,这是JSON中所有值的位置:

$.shopper.Id

$.shopper.Context.CollapseOrderItems

$.shopper.Context.IsTest

$.SelfIdentifiersData[0].SelfIdentifierData.SelfIdentifierType.SelfIdentifierType

$.SelfIdentifiersData[1].SelfIdentifierData.SelfIdentifierType.SelfIdentifierType

然后,理想情况下,我将能够获取该列表并解析相同的JSON对象以获取每个值。

//after list is created

Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);

for (String path : jsonPaths) {

Object value = JsonPath.read(document, path);

//do something

}

我知道我可以获得一个以JSON文件表示的Map,但是我不确定它是否提供相同的简便性来检索所有值。如果有一个简单的方法可以处理JSONPath,那就太好了,否则欢迎使用任何其他方法。

回答:

我想出了一个解决方案,以防万一其他人在寻找相同的东西:

public class JsonParser {

private List<String> pathList;

private String json;

public JsonParser(String json) {

this.json = json;

this.pathList = new ArrayList<String>();

setJsonPaths(json);

}

public List<String> getPathList() {

return this.pathList;

}

private void setJsonPaths(String json) {

this.pathList = new ArrayList<String>();

JSONObject object = new JSONObject(json);

String jsonPath = "$";

if(json != JSONObject.NULL) {

readObject(object, jsonPath);

}

}

private void readObject(JSONObject object, String jsonPath) {

Iterator<String> keysItr = object.keys();

String parentPath = jsonPath;

while(keysItr.hasNext()) {

String key = keysItr.next();

Object value = object.get(key);

jsonPath = parentPath + "." + key;

if(value instanceof JSONArray) {

readArray((JSONArray) value, jsonPath);

}

else if(value instanceof JSONObject) {

readObject((JSONObject) value, jsonPath);

} else { // is a value

this.pathList.add(jsonPath);

}

}

}

private void readArray(JSONArray array, String jsonPath) {

String parentPath = jsonPath;

for(int i = 0; i < array.length(); i++) {

Object value = array.get(i);

jsonPath = parentPath + "[" + i + "]";

if(value instanceof JSONArray) {

readArray((JSONArray) value, jsonPath);

} else if(value instanceof JSONObject) {

readObject((JSONObject) value, jsonPath);

} else { // is a value

this.pathList.add(jsonPath);

}

}

}

}

以上是 如何从JSON字符串获取指向值的所有JSON路径的列表? 的全部内容, 来源链接: utcz.com/qa/407379.html

回到顶部