Перепишите json через json библиотеку путей на разных уровнях с одним и тем же "ключом" - PullRequest
1 голос
/ 06 августа 2020

Предположим, что у нас есть 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"
  }
}

Используемый java json библиотека путей

        <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]) с указанным c элементом не работает.

У меня возникла идея использовать функциональность предиката json пути, подобную этому

jsonContext.read("$..[?(@.next)]")

, но он возвращает блок json вместо точного следующее значение, поэтому я не могу сравнить его с текущим искомым значением, полученным в процессе чтения. введите описание изображения здесь

Есть идеи, что делать? :)

1 Ответ

0 голосов
/ 06 августа 2020

Вы ищете функцию map класса DocumentContext.

пример:

jsonContext.map("$..next", (Object object, Configuration configuration) -> {
    return doCustomTransformation(object.toString());
});
...