重写 json via json 不同级别的路径库相同 "key"
Rewrite json via json path library in different levels with the same "key"
假设我们有一个像这样的json
{
"data": [
{
"id": "...",
"name": "...",
"participants": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
},
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
},
"messages": {
"data": [
{
"id": "...",
"created_time": ...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
}],
"paging": {
"cursors": {
"after": "..."
},
"next": "https://host/v7.0/id/messages?access_token=...fields=id%2Ccreated_time%2Cmessage%2Cfrom%2Cto%2Cis_unsupported%2Cstory%2Cattachments%2Creactions%2Cshares%7Blink%7D&limit=25&after=ZAXlKamRYSnpiM0lpT2lJeU9UTTVNell5T0RnM05qQTFOakkyTmpReU1qRTBPVFV5TWpZAME1EWXdNVEE0T0NKOQZDZD"
}
}
}
],
"paging": {
"cursors": {
"after": "..."
},
"next": "https://host/v7.0/id/conversations?access_token=...&fields=id%2Cname%2Cparticipants%2Cmessages%7Bid%2Ccreated_time%2Cmessage%2Cfrom%2Cto%2Cis_unsupported%2Cstory%2Cattachments%2Creactions%2Cshares%7Blink%7D%7D%2Cupdated_time&platform=instagram&limit=1&after=ZAXlKMGFXMWxjM1JoYlhBaU9qRTFPVFkwTlRjME1qVXNJblJvY21WaFpBRjlwWkFDSTZAJak0wTURJNE1qTTJOamcwTVRjeE1ETXdNRGswT1RFeU9ERXlORGt4T0RRNE16SXdPVGd3TUNKOQZDZD"
}
}
使用的javajson路径库
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.4.0</version>
</dependency>
在清理过程中,应修改此 json 字符串。
...
JSONArray jsonPathNextUrl = jsonContext.read(NEXT_URL_JSON_PATH_REGEX);
...
if (isNotEmpty(jsonPathNextUrl)) {
for (int i = 0; i < jsonPathNextUrl.size(); i ++) {
String nextJsonPath = jsonPathNextUrl.get(i).toString();
final String nextUrl = rewritePaging(nextJsonPath, replacementUrl);
// jsonContext.set("$..next" + "[" + i + "]", nextUrl);
}
}
我的问题是我不想修改此 JsonArray 中具有相同值但不同的所有“下一个”值。
但是 jsonContext.set(...[i]) 与特定项目不起作用。
我想像这样使用 json 路径的谓词功能
jsonContext.read("$..[?(@.next)]")
但它会返回 json 块,而不仅仅是确切的下一个值,因此我无法将它与我从读取过程中获得的当前搜索值进行比较。
知道该怎么做吗? :)
您正在寻找 DocumentContext
class 的 map
函数。
示例:
jsonContext.map("$..next", (Object object, Configuration configuration) -> {
return doCustomTransformation(object.toString());
});
假设我们有一个像这样的json
{
"data": [
{
"id": "...",
"name": "...",
"participants": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
},
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
},
"messages": {
"data": [
{
"id": "...",
"created_time": ...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
},
{
"id": "...",
"created_time": "...",
"message": "...",
"from": {
"username": "...",
"id": "...",
"user_id": "..."
},
"to": {
"data": [
{
"username": "...",
"id": "...",
"user_id": "..."
}
]
}
}],
"paging": {
"cursors": {
"after": "..."
},
"next": "https://host/v7.0/id/messages?access_token=...fields=id%2Ccreated_time%2Cmessage%2Cfrom%2Cto%2Cis_unsupported%2Cstory%2Cattachments%2Creactions%2Cshares%7Blink%7D&limit=25&after=ZAXlKamRYSnpiM0lpT2lJeU9UTTVNell5T0RnM05qQTFOakkyTmpReU1qRTBPVFV5TWpZAME1EWXdNVEE0T0NKOQZDZD"
}
}
}
],
"paging": {
"cursors": {
"after": "..."
},
"next": "https://host/v7.0/id/conversations?access_token=...&fields=id%2Cname%2Cparticipants%2Cmessages%7Bid%2Ccreated_time%2Cmessage%2Cfrom%2Cto%2Cis_unsupported%2Cstory%2Cattachments%2Creactions%2Cshares%7Blink%7D%7D%2Cupdated_time&platform=instagram&limit=1&after=ZAXlKMGFXMWxjM1JoYlhBaU9qRTFPVFkwTlRjME1qVXNJblJvY21WaFpBRjlwWkFDSTZAJak0wTURJNE1qTTJOamcwTVRjeE1ETXdNRGswT1RFeU9ERXlORGt4T0RRNE16SXdPVGd3TUNKOQZDZD"
}
}
使用的javajson路径库
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.4.0</version>
</dependency>
在清理过程中,应修改此 json 字符串。
...
JSONArray jsonPathNextUrl = jsonContext.read(NEXT_URL_JSON_PATH_REGEX);
...
if (isNotEmpty(jsonPathNextUrl)) {
for (int i = 0; i < jsonPathNextUrl.size(); i ++) {
String nextJsonPath = jsonPathNextUrl.get(i).toString();
final String nextUrl = rewritePaging(nextJsonPath, replacementUrl);
// jsonContext.set("$..next" + "[" + i + "]", nextUrl);
}
}
我的问题是我不想修改此 JsonArray 中具有相同值但不同的所有“下一个”值。
但是 jsonContext.set(...[i]) 与特定项目不起作用。
我想像这样使用 json 路径的谓词功能
jsonContext.read("$..[?(@.next)]")
但它会返回 json 块,而不仅仅是确切的下一个值,因此我无法将它与我从读取过程中获得的当前搜索值进行比较。
知道该怎么做吗? :)
您正在寻找 DocumentContext
class 的 map
函数。
示例:
jsonContext.map("$..next", (Object object, Configuration configuration) -> {
return doCustomTransformation(object.toString());
});