当前位置: 首页 > 知识库问答 >
问题:

根据json路径删除/修改json对象的Java库是什么,或者如何修复JSONPath中的以下问题?

艾浩广
2023-03-14

我正在尝试实现一个函数,以便能够基于指定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。

我做了一些搜索,找到的一个lib是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。然而,有一件很明显的事情困扰着我:

看看.toString()在before和after大小写中生成的json字符串,JSONObject API以真正的json标准格式打印了一个很好的字符串,其中每个双引号都是“”,而JsonPath.toString生成了一个客户字符串格式,其中一些元素在双引号中,而其他元素则不是,所以我不能像JSONObject那样进一步使用它。

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

不管怎么说,有没有人知道如何从jsonPathAPI(如remove()、put()、read()和许多其他API中获得一个很好的格式化json字符串?或者将返回值转换为类似于JSONObject的东西?

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

共有1个答案

澹台星光
2023-03-14

我不知道JsonPath。

我认为在Java使用JSON时应该使用jackson,它实际上是标准库

你要做的最接近的事情是:

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

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

并用任何其他函数替换getValueAsInt

 类似资料:
  • 如何修复从Json到React组件渲染的本地路径, 我在互联网上到处寻找答案,但运气不好:( 从'React'类导入React产品扩展React.Component{constructor(props){super(props)} }

  • 我正在做一个控制器测试,测试返回的json值是否正确。这是我的json 我的问题是,如何在accounts字段中为accountName编写jsonPath?谢了。

  • 你可以使用点号(.)来修改 JSON 对象的值。如: myObj.zhihu = "https://www.zhihu.com/people/leiqikui/"; 你可以使用中括号([])来修改 JSON 对象的值。如: myObj["zhihu"] = "https://www.zhihu.com/people/leiqikui/";

  • 我知道这可能是一个重复,但仍然张贴我的问题,因为我找不到确切的答案我在寻找什么。我有一个json对象(或字符串)如下。 我将从RESTAPI测试中得到相同类型的响应,但是在每次调用之后,“timestamp”键将具有一个动态日期和时间值,该值与调用的时间有关。在这里,我使用JSONAssert将我的expect json与实际json作为一个整体进行比较。因为时间戳值不同,所以对我来说总是失败。

  • 全部的我和你有一个很奇怪的问题https://github.com/json-path/JsonPath 其中一个问题似乎是实现中存在的重入问题:当执行路径时,每个片段返回一个字符串: 我通过将JSONObject/JSONArray传递给JsonPath.read()而不是JSON字符串来“黑客”。做完后,现在我得到了: 如您所见,这已经是一个数组。我在谷歌上搜索了很多次,但都找不到问题所在。

  • 如何修改沙箱路径下json文件的指定内容