java - 将文本字段数据附加到 java 中的现有 JSON 文件

标签 java json gson

我有一个文本字段,用户可以在其中输入数据,收到数据后我想将其附加到现有的 JSON 文件中。

我能够读取现有数据并获取文本字段值,但是在将新数据附加到现有数据时我遇到了问题。

错误:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 18 path $

下面的代码:

JSON 文件:

{"vins":[{"vin":"544554"},{"vin":"54554"}]}

文本字段值:字符串测试=“3689”; 所以它应该附加为:

{"vins":[{"vin":"544554"},{"vin":"54554"},{"vin":"3689"}]}

文件读写类:

public class JSONFIlewrite {
    public static String Vinno_Read;
    public static List<String> linststring;
    public static void main(String[] args) {
        try {

            JSONParser parser = new JSONParser();
            Object obj = parser.parse(new 
            FileReader("C:\\Amaresh\\Test\\sample_json.json"));

            JSONObject jsonObject = (JSONObject) obj;
            System.out.println(jsonObject);
            linststring= new ArrayList();
            // loop array
            JSONArray msg = (JSONArray) jsonObject.get("vins");
            Iterator iterator = msg.iterator();

            while (iterator.hasNext()) {
                Vinno_Read = iterator.next().toString();

                linststring.add(Vinno_Read);


            }

            String list_string = "";
            System.out.println(linststring);

            for(String temp:linststring){
                list_string += temp;
                System.out.println("amar1"+list_string);
            }

            System.out.println("amar"+list_string);
            Vin vin4 = new Vin();
            vin4.setVin("76354273462");
            Vins vins = new Vins();
            vins.addVins(vin4);

            Gson gson = new Gson();
            //String jsonValue=list_string;

            String jsonValue = gson.toJson(list_string).toString();
            System.out.println("json--"+jsonValue);
            Vins vins1 = gson.fromJson(jsonValue, Vins.class);
            System.out.println("ddd"+vins1);
            Vin vin = new Vin();
            vin.setVin("544554");

            vins1.addVins(vin);

            jsonValue = gson.toJson(vins1).toString();

            BufferedWriter writer = null;
            try {
                writer = new BufferedWriter(new FileWriter("C:\\Amaresh\\Test\\sample_json.json"));
                writer.write(jsonValue);
                System.out.println("Test"+jsonValue);

            } catch (IOException e) {
            } finally {
              try {
                if (writer != null)
                    writer.close();
              } catch (IOException e) {
            }
        }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

Setter Getter 类:

public class Vin {
    @Expose
    private String vin;

    public String getVin() {
        return vin;
    }

public void setVin(String vin) {
    this.vin = vin;
}

}


public class Vins {
    @Expose
    List<Vin> vins = new ArrayList<>();

    public List<Vin> getVins() {
        return vins;
    }

    public void addVins(Vin vin) {
        this.vins.add(vin);
    }
}

最佳答案

主要逻辑:

你可以在代码中看到4个 block

  1. 读取json文件并解析为java Object
  2. 将 java Object 转换为 JSonObject,解析为 JsonArray 并迭代打印 JsonElement 的数组s
  3. 创建一个新的 Vin 对象 并使用 Gson.toJson 方法将其转换为 JSON 字符串(第二部分不是必需的,仅用于说明目的)
  4. 创建一个 JsonWriter,创建一个 Vins 对象 并使用原始 JsonArray 加载它,然后添加一个新元素(对应于在步骤 #3 中创建新的 Vin 对象,最后将 Vins 对象 写入 [new] 文件。

输入:

{"vins":[{"vin":"544554"},{"vin":"54554"}]}

输出:

{"vins":[{"vin":"544554"},{"vin":"54554"},{"vin":"3689"}]}

代码

import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonWriter;

public class JSONFIlewrite {
    public static String Vinno_Read;
    public static List<String> linststring;

    public static void main(String[] args) {
        try {

            JsonParser parser = new JsonParser();
            Object obj = parser.parse(new FileReader("C:\\Amaresh\\Test\\sample_json.json"));



            JsonObject jsonObject = (JsonObject) obj;
            System.out.println(jsonObject);
            linststring = new ArrayList<String>();
            // loop array
            JsonArray msg = (JsonArray) jsonObject.get("vins");
            Iterator<JsonElement> iterator = msg.iterator();
            while (iterator.hasNext()) {
                Vinno_Read = iterator.next().toString();
                System.out.println("Vinno_Read---->" + Vinno_Read);
            }



            Vin newVin = new Vin();
            newVin.setVin("3689");
            Gson gson = new Gson();
            String json = gson.toJson(newVin);
            System.out.println("json---->" + json);



            FileWriter file = new FileWriter("C:\\Amaresh\\Test\\sample_json2.json", false);
            JsonWriter jw = new JsonWriter(file);
            iterator = msg.iterator();
            Vins vins = new Vins();
            while (iterator.hasNext()) {
                vins.addVin(gson.fromJson(iterator.next().toString(), Vin.class));
            }
            vins.addVin(newVin);
            gson.toJson(vins, Vins.class, jw);
            file.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

注释:

由于我不知道您使用的是什么库,因此我已更新类名以与 GSON 兼容。

我还将Vins Class中的方法:public void addVins(Vin vin)更改为public void addVin(Vin vin)

关于java - 将文本字段数据附加到 java 中的现有 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44464218/

相关文章:

java - 难以捉摸的 Java 内存泄漏

java - 构造函数的 @Inject 问题

java - Log4j2 Howto 在自定义字段中从 MapMessage 查找值

json - 在 json 文件中的对象之间添加逗号

java - Gson 用键解析数组的数组

java - 在控制台上用Java打印金字塔

ios - JSON解析奇数节点

android - "Not a primitive array"错误,当我尝试从 JSON 中拉出一个 child 时

java - 无法解析 JSON 对象数组

Gson 的 javax.json 序列化器/反序列化器