You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中修改含连字符的JSON键对应的值?

解决JSON子对象属性修改问题

你的问题出在没有正确定位到metadata这个子JSON对象,直接在顶层JSONObject上做put操作自然会新增错误的键值对。正确的步骤是先获取metadata子对象,再修改它内部的属性,最后将修改后的JSON写回文件。

错误原因分析

  • 第一种写法:body.put(body.getJSONObject("metadata").getString("X-Object-Meta-Favourite"), action)
    这里第一个参数是读取到的旧值"true",相当于在顶层JSON新增了"true": "false"的键值对,完全偏离目标。
  • 第二种写法:body.put("metadata['X-Object-Meta-Favourite']", action)
    是把整个字符串当作顶层键,所以新增了"metadata['X-Object-Meta-Favourite']": "false"的顶层键值对,同样错误。

正确代码实现

public void favourite(String action) throws IOException {
    action = "false"; // 或者根据需求使用布尔值false:action = Boolean.FALSE.toString();

    // 读取JSON文件到顶层JSONObject
    JSONObject body = readFiles.favourite();
    // 获取metadata子JSONObject
    JSONObject metadata = body.getJSONObject("metadata");
    // 修改metadata内部的目标属性值
    metadata.put("X-Object-Meta-Favourite", action);

    // 将修改后的JSON写回原文件(这一步不能少,否则修改只存在于内存中)
    Files.write(Paths.get("src/test/resources/config/environments/FileSystem/Favourite.json"), 
                body.toString().getBytes());
}

补充说明

  • 如果需要将值改为布尔类型的false而非字符串"false",可以直接写metadata.put("X-Object-Meta-Favourite", false);,这样JSON里的对应值会变成false(不带引号)。
  • 注意方法名拼写:你原来的方法名fovurite是拼写错误,建议修正为favourite。

内容的提问来源于stack exchange,提问作者CvMr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:56:09