Что такое библиотека java для удаления / изменения объекта json на основе пути json или как исправить приведенную ниже проблему в JsonPath? - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь реализовать функцию, позволяющую удалять или изменять базу объектов json по указанному пути json.Например, если у меня есть ниже строка / объект json:

{
  "PersonalDetailsDTO": {
    "FirstName": "Mark",
    "LastName": "Sully",
    "TotalDependent": "2",
    "DOB": "19811212",
    "SecQuestion": "Some Que",
    "SecAnswer": "Some-Ans",
    "Mobile": "0123456789",
    "Email": "some@validemail.com",
    "Title": "Mr",
    "EmploymentListDTO": [
      {
        "Type": "Full-time",
        "Probation": true
      }
    ],
    "AddressListDTO": [
      {
        "AddressType": "BUS",
        "PostCode": "1234",
        "State": "NSW",
        "StreetName": "miller",
        "StreetNumber": "111",
        "StreetType": "Invalid",
        "Suburb": "Sydney",
        "UnitNumber": "Maximum"
      }
    ]
  }
}

И я хочу удалить элемент $ .PersonalDetailsDTO.AddressListDTO.PostCode.

Я сделал довольно небольшой поиск,и одна библиотека, которую я нашел, это JsonPath: http://static.javadoc.io/com.jayway.jsonpath/json-path/2.2.0/com/jayway/jsonpath/JsonPath.html

Итак, я написал следующий код:

public static void main(String[] args) {
    // Prints "Hello, World" to the terminal window.
    String jsonString = "{\n" +
            "  \"PersonalDetailsDTO\": {\n" +
            "      \"FirstName\":\"Mark\",\n" +
            "      \"LastName\":\"Sully\",\n" +
            "      \"Title\":\"Mr\",\n" +
            "      \"DOB\":\"19811201\",\n" +
            "    \"SecQuestion\":\"Some Ques\",\n" +
            "    \"SecAnswer\":\"Some-Ans\",\n" +
            "    \"Email\":\"some@validemail.com\",\n" +
            "    \"EmploymentListDTO\": [\n" +
            "      {\n" +
            "        \"Type\": \"Full-time\",\n" +
            "        \"Probation\": true\n" +
            "      }\n" +
            "    ],\n" +
            "    \"AddressListDTO\": [\n" +
            "      {\n" +
            "        \"AddressType\": \"Residential\",\n" +
            "        \"PostCode\": \"2345\",\n" +
            "        \"State\": \"NSW\",\n" +
            "        \"StreetName\": \"MEL\",\n" +
            "        \"StreetNumber\": \"2\",\n" +
            "        \"StreetType\": \"Boulevard\",\n" +
            "        \"Suburb\": \"Melbourne\",\n" +
            "        \"UnitNumber\": \"345\"\n" +
            "      }\n" +
            "     ]\n" +
            "   }  \n" +
            "}";

    JSONObject jsonObject = new JSONObject(jsonString);
    System.out.println("Before: " + jsonObject.toString());

    JsonPath jp = JsonPath.compile("$.PersonalDetailsDTO.AddressListDTO[0].PostCode");
    Configuration conf = Configuration.defaultConfiguration();
    Object json = conf.jsonProvider().parse(jsonString);
    System.out.println("After: " + jp.delete(json, conf).toString());
}

И в журнале консоли отображается:

Before: {"PersonalDetailsDTO":{"EmploymentListDTO":[{"Type":"Full-time","Probation":true}],"SecAnswer":"Some-Ans","Email":"some@validemail.com","SecQuestion":"Some Ques","FirstName":"Mark","DOB":"19811201","AddressListDTO":[{"StreetName":"MEL","Suburb":"Melbourne","State":"NSW","StreetNumber":"2","UnitNumber":"345","AddressType":"Residential","PostCode":"2345","StreetType":"Boulevard"}],"Title":"Mr","LastName":"Sully"}}


After: {PersonalDetailsDTO={FirstName=Mark, LastName=Sully, Title=Mr, DOB=19811201, SecQuestion=Some Ques, SecAnswer=Some-Ans, Email=some@validemail.com, EmploymentListDTO=[{"Type":"Full-time","Probation":true}], AddressListDTO=[{"AddressType":"Residential","State":"NSW","StreetName":"MEL","StreetNumber":"2","StreetType":"Boulevard","Suburb":"Melbourne","UnitNumber":"345"}]}}

Взглядкак JsonPath делает свою работу и удаляет $ .PersonalDetailsDTO.AddressListDTO.PostCode.Однако есть кое-что очень очевидное, что беспокоит меня:

Глядя на строку json, создаваемую .toString () в до и после регистра, JSONObject API выводил красивую строку в истинном стандартном формате json с каждым двойнымкавычки "" присутствуют, в то время как JsonPath .toString создает формат строки клиента, в котором некоторые элементы заключены в двойные кавычки "", а другие нет, и я не могу использовать его далее, как JSONObject.

И что язамечено, что хотя JsonPath утверждает, что принимает «java.lang.Object» в качестве параметра во многих своих функциях, то, что он действительно принимает, называется «jsonProvider».Не уверен, вызывает ли это странное поведение .toString ().

В любом случае, кто-нибудь знает, как получить хорошую отформатированную строку json из API-интерфейсов JsonPath, таких как remove (), put (), read ()и многие другие?Или преобразовать возвращаемое значение во что-то вроде JSONObject?

Если вам известна любая другая библиотека Java, которая может удалять / изменять элемент по пути json, пожалуйста, не стесняйтесь рекомендовать.Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

Я не знаю JsonPath.

Я думаю, что вы должны использовать Джексона, который является стандартной библиотекой defacto при работе с JSON в Java

Примерно то, что вы собираетесь сделать, это:

String jsonString = "{"k1": {"k2":"v2"}";

    ObjectMapper mapper = new ObjectMapper();
    JsonNode actualObj = mapper.readTree(jsonString);
    actualObj.at("/k1/k2").getValueAsInt()

и замените getValueAsInt любой другой функцией

...