【问题标题】:How to change values in a json file using XPath/JsonPath in java如何在 java 中使用 XPath/JsonPath 更改 json 文件中的值
【发布时间】:2014-12-02 07:57:38
【问题描述】:

这是json文件

{
    "session":
        {
            "name":"JSESSIONID",
            "value":"5864FD56A1F84D5B0233E641B5D63B52"
        },
    "loginInfo":
        {
            "loginCount":77,
            "previousLoginTime":"2014-12-02T11:11:58.561+0530"
        }
}

我想改变name的值,直接给XPath/JsonPath Like

($.session.name).changevalue("MYSESSINID") 这只是一个例子

我正确使用 jackson 库并使用以下代码通过 XPath 进行读取

ObjectMapper mapper = new ObjectMapper();

        Object jsonObj=mapper.readValue(new File(Json file), Object.class);
        Object name=PropertyUtils.getProperty(jsonObj, "session.name");
        System.out.println("Name:"+name);

这是他们通过 XPath 更改名称的一种方式

PropertyUtils.setProperty(jsonObj, "session.value", "new value");

仍然在文件中它不工作。

【问题讨论】:

  • PropertyUtils 也有 setProperty 方法,你试过吗?
  • @flup setProperty 代码不起作用它没有给出任何错误但它也没有改变值
  • 对象树只存在于内存中。因此,在您更改对象树中的值后,您必须将其序列化回文件。
  • @flup
    PropertyUtils.setProperty(jsonObj, "session.name", "lkihilh"); mapper.writeValue(json 文件,jsonObj);如果文件很大,这将把整个 json 代码写在一个文件中它会消耗很多时间是他们用其他方式来做的吗
  • 可能最好为新问题创建一个新问题:)

标签: java json xpath jackson jsonpath


【解决方案1】:

使用Jayways JsonPath,您可以:

private static final Configuration configuration = Configuration.builder()
    .jsonProvider(new JacksonJsonNodeJsonProvider())
    .mappingProvider(new JacksonMappingProvider())
    .build();

@Test
public void a_value_can_be_updated(){

    String originalJson = "{\n"
        + "\"session\":\n"
        + "    {\n"
        + "        \"name\":\"JSESSIONID\",\n"
        + "        \"value\":\"5864FD56A1F84D5B0233E641B5D63B52\"\n"
        + "    },\n"
        + "\"loginInfo\":\n"
        + "    {\n"
        + "        \"loginCount\":77,\n"
        + "        \"previousLoginTime\":\"2014-12-02T11:11:58.561+0530\"\n"
        + "    }\n"
        + "}";

    JsonNode updatedJson = JsonPath.using(configuration).parse(originalJson).set("$.session.name", "MYSESSINID").json();

    System.out.println(updatedJson.toString());
}

您可以配置默认的 JsonProvider,这样您就不必在所有调用中都传递它。

【讨论】:

  • 我尝试了您的解决方案,但它将数值设置为字符串。有什么解决办法吗?例如:尝试将登录计数设置为 1,它返回为:“loginCount”:“1”
  • 哦,找到了解决方案!传递整数对象设置为 int
  • 多个节点匹配怎么办?看起来需要像“forEach”这样的自定义处理程序,可以处理任何类型的节点。
  • 请注意,这仅在指定的键已经存在时才有效。
【解决方案2】:
PropertyUtils.setProperty(jsonObj, "session.value", "new value");
        PropertyUtils.setProperty(jsonObj, "session.name", "new name");
        mapper.writeValue(Json File ,jsonObj);

【讨论】:

  • 不幸的是,mapper 没有定义,所以这不起作用。
  • 什么是“映射器”?
【解决方案3】:

我发现在 Json 内部进行交换的最简单方法(当我的 BodyJSONObject 时)

import com.jayway.jsonpath.JsonPath;


JsonPath.parse(Body).set(fieldPath, Value);

【讨论】:

    猜你喜欢
    • 2019-02-18
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2021-09-03
    相关资源
    最近更新 更多