代码之家  ›  专栏  ›  技术社区  ›  user1559625

基于json path删除/修改json对象的java库是什么,或者如何在JsonPath中修复以下问题?

  •  0
  • user1559625  · 技术社区  · 6 年前

    {
      "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.

    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"}]}}
    

    查看.toString()在前后大小写中生成的json字符串,

    我注意到尽管JsonPath声称接受java.lang.Object作为许多函数中的参数,它真正接受的是一个叫做“jsonProvider”的东西。不确定它是否导致了奇怪的.toString()行为。

    不管怎样,有人知道如何从JsonPath api(如remove()、put()、read()等)中获取一个格式良好的json字符串吗?或者将返回值转换为JSONObject之类的东西?

    如果您知道其他可以通过json路径删除/修改元素的Java库,请随时推荐。谢谢您!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Maksym Rudenko    6 年前

    我不知道JsonPath。

    我认为在java中使用JSON时,应该使用jackson,它是事实上的标准库

    大概你要做的是:

    String jsonString = "{"k1": {"k2":"v2"}";
    
        ObjectMapper mapper = new ObjectMapper();
        JsonNode actualObj = mapper.readTree(jsonString);
        actualObj.at("/k1/k2").getValueAsInt()
    

    并将getValueAsInt替换为任何其他函数