【问题标题】:GSON adding java objects from arraylist to existing json file?GSON将java对象从arraylist添加到现有的json文件?
【发布时间】:2018-10-29 01:02:00
【问题描述】:

我有一个程序,目前可以从 JSON 文件中读取并将它们实现到一个对象中,并存储在一个对象数组列表中。昨天我问了一个关于如何写回 JSON 文件的问题,有人建议使用 .put 方法,但是这不能以 JSON 格式正确写入。例如,当 .json 文件中存在如下现有 JSON 对象时: [ { "waterSpace": 4.0, "airSpace": 5.0, "landSpace": 3.0, "name": "robbie", "penType": "pen" } ] 但是当我使用 .put 添加它时,会执行以下操作 [ { "waterSpace": 4.0, "airSpace": 5.0, "landSpace": 3.0, "name": "robbie", "penType": "pen" } ]{"waterSpace": 4.0, "airSpace": 5.0, "landSpace": 3.0, "name": "robbie", "penType": "pen" }

如何使用 GSON 正确添加数组列表中的对象,以便格式正确,如下所示: [ { "waterSpace": 4.0, "airSpace": 5.0, "landSpace": 3.0, "name": "robbie", "penType": "pen" },{ "waterSpace": 4.0, "airSpace": 5.0, "landSpace": 3.0, "name": "robbie", "penType": "pen" } ]

【问题讨论】:

    标签: java json arraylist gson


    【解决方案1】:

    GSON 也有一个序列化器,所以您只需要使用 fromJson 方法将您的对象再次转换为 JSON。

    import java.util.ArrayList;
    import java.util.List;
    
    import org.json.JSONArray;
    
    import com.google.common.reflect.TypeToken;
    import com.google.gson.Gson;
    
    public class Deserializer {
    
        public static void main(String[] args) {
           Gson gson = new Gson();
           List<YourObject> yourObjectList = new ArrayList<>();
           YourObject object1 = new YourObject(10.2, 3.7, 8.5, "test", "test");
           YourObject object2 = new YourObject(5.7, 4.9, 3.1, "test2", "test2");
           yourObjectList.add(object1);
           yourObjectList.add(object2);
           JSONArray jsonArray = new JSONArray(
                gson.toJson(yourObjectList, new TypeToken<List<YourObject>>() {}.getType()));
           System.out.println(jsonArray);
       }
    
        public static class YourObject {
    
           private double waterSpace;
           private double airSpace;
           private double landscape;
           private String name;
           private String penType;
    
           public YourObject(double waterSpace, double airSpace, double landscape, String name, String penType) {
               this.waterSpace = waterSpace;
               this.airSpace = airSpace;
               this.landscape = landscape;
               this.name = name;
               this.penType = penType;
          }
    
          @Override
          public String toString() {
            return String.valueOf(this.waterSpace) + " " + String.valueOf(this.airSpace) + " "
                    + String.valueOf(this.landscape) + " " + this.name + " " + this.penType;
          }
       }
    }
    

    【讨论】:

    • 嗨,这看起来不错,但是请参见创建 json 数组的行,您将对象放在引号中,但这意味着我必须手动添加对象。我的想法是使用循环自动执行此操作,从动物数组列表中添加对象?请帮忙
    • 编辑了创建对象而不是读取 JSON 的答案。但是没有区别,你会用同样的方法 toJson 来序列化对象。在上一个答案中,我反序列化了 JSON,所以列表中的元素也是对象
    【解决方案2】:

    这是一个在 Spring Boot 项目中实现的示例,但您可以在简单的 Java 应用程序或其他应用程序中实现:

    @SpringBootApplication
    public class AlfredValidator1Application  implements CommandLineRunner{
    
    public static void main(String[] args) {
        SpringApplication.run(AlfredValidator1Application.class, args);
    }
    
    @Override
    public void run(String... args) throws Exception {
    
        test t1=new test(4.0, 5.0, 3.0, "robbie", "pen");
        test t2=new test(4.0, 5.0, 3.0, "robbie", "pen");
        List<test> listTest=new ArrayList<>();
        listTest.add(t1);
        listTest.add(t2);
        System.out.println(new ObjectMapper().writeValueAsString(listTest));// you can use Gson instead
    }
    }
    
    class test{
    private double waterSpace;
    private double airSpace;
    private double landSpace;
    private String name;
    private String penType;
    
    public test(){
    
    }
    
    public test(double waterSpace, double airSpace, double landSpace, String name, String penType) {
        super();
        this.waterSpace = waterSpace;
        this.airSpace = airSpace;
        this.landSpace = landSpace;
        this.name = name;
        this.penType = penType;
    }
    
    public double getWaterSpace() {
        return waterSpace;
    }
    
    public void setWaterSpace(double waterSpace) {
        this.waterSpace = waterSpace;
    }
    
    public double getAirSpace() {
        return airSpace;
    }
    
    public void setAirSpace(double airSpace) {
        this.airSpace = airSpace;
    }
    
    public double getLandSpace() {
        return landSpace;
    }
    
    public void setLandSpace(double landSpace) {
        this.landSpace = landSpace;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getPenType() {
        return penType;
    }
    
    public void setPenType(String penType) {
        this.penType = penType;
    }
    

    }

    【讨论】:

    • 对一个无缘无故增加使用巨型框架的解决方案投反对票。
    • @bhspencer 我不想告诉他使用 spring boot 作为框架,但我想给他一个例子,如果他愿意,他可以在没有任何框架或其他框架的情况下使用它所以你对我的反对票没有任何意义
    • 然后考虑编写一个简单的答案,仅向 OP 展示如何解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2015-05-28
    • 2013-09-02
    • 2016-01-09
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多