【问题标题】:How to Update JSON value using Java如何使用 Java 更新 JSON 值
【发布时间】:2021-02-01 22:40:39
【问题描述】:

我有以下 json,我想更新该 json 的每一个值,但有时只有一个值

{ 
"msgType": "NEW",
"code": "205",
"plid": "PLB52145",
}

我已经尝试使用以下代码进行更新

FileReader reader = new FileReader(filePath);

JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);

System.out.println(jsonObject);


long id =Long.valueOf((String) idNewObj.get("plid"));
System.out.println(plid);


idNewObj.put("plid",PL809809809);

System.out.println(jsonObject);

【问题讨论】:

  • 输出是什么?有什么问题?
  • value were not changed ,因此给出以下解决方案来写入值。它有效:) 谢谢@papaya

标签: java json rest


【解决方案1】:

为了对 JSON 文件进行转换/过滤,我建议使用面向流/事件的解析和生成,而不是任何对象映射。只是一个例子,它使用简单轻量级的 JSON 解析器https://github.com/anatolygudkov/green-jelly

import org.green.jelly.AppendableWriter;
import org.green.jelly.JsonEventPump;
import org.green.jelly.JsonParser;

import java.io.StringWriter;
import java.io.Writer;

public class UpdateMyJson {
    private static final String jsonToUpdate = "{\n" +
            "\"msgType\": \"NEW\",\n" +
            "\"code\": \"205\",\n" +
            "\"plid\": \"PLB52145\",\n" +
            "}";

    public static void main(String[] args) {
        final StringWriter result = new StringWriter();

        final JsonParser parser = new JsonParser();
        parser.setListener(new MyJsonUpdater(result));
        parser.parse(jsonToUpdate); // if you read a file with a buffer,
        // call parse() several times part by part in a loop until EOF
        parser.eoj(); // and then call .eoj()

        System.out.println(result);
    }

    static class MyJsonUpdater extends JsonEventPump {
        private boolean isPlid;

        MyJsonUpdater(final Writer output) {
            super(new AppendableWriter<>(output));
        }

        @Override
        public boolean onObjectMember(final CharSequence name) {
            isPlid = "plid".contentEquals(name);
            return super.onObjectMember(name);
        }

        @Override
        public boolean onStringValue(final CharSequence data) {
            if (isPlid) {
                if ("PLB52145".contentEquals(data)) {
                    return super.onStringValue("PL809809809");
                }
            }
            return super.onStringValue(data);
        }
    }
}

道具:

  1. 文件/数据不需要完全加载到内存中,您可以毫无问题地处理 megs/gigs
  2. 运行速度更快,尤其是对于大文件
  3. 使用此模式可以轻松实现任何自定义类型/转换规则

标准的 Gson 和 Jackson 库还提供标记器以流式处理 JSON。

更新:使用了 JsonEventPump

【讨论】:

    【解决方案2】:

    您需要将更新后的 JSON 写入读取 JSON 的文件中。另外,我不明白你的变量分配,所以我也更新了。使用以下代码:

    FileReader reader = new FileReader(filePath);
    
    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
    
    System.out.println(jsonObject);
    
    
    long id =Long.valueOf((String) idNewObj.get("plid"));
    System.out.println(id);
    
    
    jsonObject.put("plid",PL809809809);
    
    System.out.println(jsonObject);
    FileWriter writer = new FileWriter(filePath, false); //overwrites the content of file
    writer.write(jsonObject.toString());
    writer.close();
    

    【讨论】:

    • 谁能告诉我为什么我的回答被否决了?
    • 首先不知道谁对你的anwser投了反对票.......尝试了上面的代码,但是在 writer.write(jsonObject);我在 OutPutStreamWriter 类型中收到错误 write(int) 不适用于参数 (JSONObject)
    • @Dhananjay_Khade 我已经编辑了我的答案,这将起作用! FileWriter.write(...) 接受 String 参数,因此,将其更改为 writer.write(jsonObject.toString());
    • 感谢您的回答...我已经这样做了,但是它以字符串格式打印,并且它正在改变 json 的格式,例如 json 对象的序列...如果改变序列可以吗?
    猜你喜欢
    • 2021-02-01
    • 2021-09-03
    • 2020-09-08
    • 2020-07-15
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多