【问题标题】:GSON Deserialize object with member ArrayList<String>GSON 使用成员 ArrayList<String> 反序列化对象
【发布时间】:2019-01-17 06:49:59
【问题描述】:

我见过很多类似的问题。我找不到任何适合我的确切问题的东西。在所有示例中,我发现 List 是在父类中定义的对象类型,而我只有一个字符串列表。我尝试过使用简单的数组 String[],并且看到了重载反序列化器并获取 TypeToken 的示例,但我无法将其绑定在一起以使其工作。我的列表始终为空(如果我在定义列表时未对其进行初始化,则为 null)。我在这里缺少什么,感觉就像我正在尝试做一些非常简单的事情,但我在上面找到的所有内容看起来都过于复杂。

这是我的课:

public class MondoConfig {
private String merchantURL;
public ArrayList<String> targets = new ArrayList<String>();


public MondoConfig () {}

public String getMerchantURL() {
    return this.merchantURL;
}

public void setMerchantURL(String url) {
    this.merchantURL = url;
}

public ArrayList<String> getTargets() {
    return this.targets;
}

public void setTargets(ArrayList<String> t) {
    this.targets = t;


}
}

这是我的 json:

{
"merchantURL":"https://example.com/collections/posters",
"targets":[
"testing",
"another",
"one more"
]
}

还有我要反序列化的代码:

BufferedReader br = new BufferedReader(new FileReader("C:\\mondo_config.json"));
MondoConfig config = gson.fromJson(br, MondoConfig.class);

【问题讨论】:

    标签: java json list gson deserialization


    【解决方案1】:

    我在您的代码中发现了一些问题,但我能够让它正常工作而没有任何问题。

    package org.nuttz.gsonTest;
    import java.util.ArrayList;
    
    public class MondoConfig {
       private String merchantURL;
       public ArrayList<String> targets = new ArrayList<String>();
    
       MondoConfig () {}
    
       public String getMerchantURL() {
          return this.merchantURL;
       }
    
       public void setMerchantURL(String url) {
          this.merchantURL = url;
       }
    
       public ArrayList<String> getTargets() {
          return this.targets;
       }
    
       public void setTargets(ArrayList<String> t) {
          this.targets = t;
       }
    }
    

    原始代码中的 setMerchantURL() 函数不太正确,所以我修复了它。然后我用这段代码来测试它:

    package org.nuttz.gsonTest;
    
    import java.io.*;
    import java.util.List;
    import com.google.gson.*;
    
    public class App 
    {
        public static void main( String[] args )
        {
           Gson gson = new Gson();
           try {
              BufferedReader br = new BufferedReader(new FileReader("/home/jim/mondoconfig.json"));
              MondoConfig config = gson.fromJson(br, MondoConfig.class);
              System.out.println("Contents of config:");
              System.out.println(config.getMerchantURL());
              List<String> targets = config.targets;
              for (String t : targets) {
                 System.out.println(t);
              }
           }
           catch (Exception x) {
              x.printStackTrace();
           }
        }
    }
    

    并得到以下结果:

    Contents of config:
    https://example.com/collections/posters
    testing
    another
    one more
    

    这是使用 2.8.2 版本的 GSON。换句话说,你走在正确的轨道上,你只需要修复 MondoConfig 类。

    【讨论】:

    • 当我复制粘贴到 stackoverflow 时,setMerchantURL 的这个问题是一个问题。所以现在我对为什么我的代码不起作用感到更加困惑
    • 如果你直接复制我的代码,可以吗?你真的在打开你认为的文件吗?
    • 我没有完全复制粘贴你的代码。我今晚回家时会试试的。我知道我打开了正确的文件,因为该类的其他成员已正确填充。
    • 哦,该死的。我已将 json 文件保存在计算机上的另一个位置,然后将其复制/粘贴到 c:/location。那是在我添加目标数组之前。我在原始位置编辑文件,这就是为什么所有其余数据都是正确的。感谢您的所有帮助,尤其是询问“它是否已插入”本质上是什么?支持问题。
    猜你喜欢
    • 2016-07-08
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多