【问题标题】:How to read JSON to a list of generic objects in java?如何将 JSON 读取到 Java 中的通用对象列表中?
【发布时间】:2015-06-04 02:31:42
【问题描述】:

我必须从 Web 服务获取数据,我正在使用 Jackson,但使用 Gson 时遇到同样的问题,我对单个对象没有问题,但是当我收到多个对象列表时,这对我来说并不容易。

收到的 JSON 是这样的:

{"country":
[
{"code":"AD","nombre":"Andorra","name":"Andorra"},
{"code":"AE","nombre":"Emiratos Árabes Unidos","name":"United Arab Emirates"}
]
}

这是我自己的类CountryWSType 的列表,我有几个这样的类,需要一种可以获取任何类型列表的方法。 我试过像列表一样解析它:

List<MyClass> myObjects = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class));

还尝试创建自己的列表类型:

    public class ListWSType<T> implements List<T>{

    private List<T> listaInterna;

    //implents methods
    }

但我总是收到JsonMappingException,但我不知道该怎么做。

我希望有人可以帮助我。

正如有些人在这里问的那样,这是我试图从 JSON 中解析的类:

@XmlRootElement(name="country")
@XmlType(propOrder={"code", "nombre", "name"})
public class CountryWSType {

    /** Código ISO */
    @XmlElement(name="code")
    public String code;

    /** Nombre en español */
    @XmlElement(name="nombre")
    public String nombre;

    /** Nombre en inglés */
    @XmlElement(name="name")
    public String name;

    /** Constructor sin parámetros. No inicializa nada...
     * Está para que funcione el marshall/unmarshall.
     */
    public CountryWSType() {}
}

还请注意,当我输入 MyClass 时,它的意思是 CountryWSType 类,很抱歉造成误解。

【问题讨论】:

  • 我猜 MyClass 是您的类支持 JSON 对象吗?也许如果我们能看到这个类和错误堆栈跟踪,就会更容易找出问题所在。
  • A List 将是 [{...}, {...}, ...]。你有{"country": [{...}, {...}, ...]}。这不是一个列表,它是一个带有字段country 的对象,它是一个列表。
  • 您在最外层有一个 JSON 对象,而不是 JSON 数组。这转化为地图,而不是列表。
  • 嗯,是的,我认为这就是为什么我不能像数组一样直接获取列表或类似的东西,我在其他解决方案中看到它将实现一个具有名为 country 的属性的类一个列表,但我需要一种方法,它也适用于其他类型,不仅适用于 CountryWSType。不知道我解释的对不对……

标签: java json jackson gson


【解决方案1】:

这可能会有所帮助:

//first convert input string to json array
JSONObject jsonobject = new JSONObject(countriesAsJsonString);

JSONArray jsonArray = jsnobject.getJSONArray("countries");

//then get the type for list and parse using gson as
Type listType = new TypeToken<List<MyClass>>(){}.getType();
List<MyClass> countriesList = new Gson().fromJson(jsonArray, listType);

如果你说你的 json 数组元素可以是不同的类型,那么映射器将不知道要实例化哪种类型的类,你需要在你的 json 中提供额外的属性来表明这一点,这是一种丑陋的方法,特别是如果json 是面向外部的。但是,如果这是您想要的,那么this SO 帖子中会解释。

【讨论】:

  • 是的,它的外部朝向。但问题是我不会在同一个 Json 中获得不同的类型,只需要一个可以与不同类一起使用的解决方案,例如我不能使用像 public class ListCountryWSType { private List&lt;CountryWSType&gt; countries; } 这样的自己的类,因为它只适用于 CountryWSType 而我需要它用于其他类型也一样。
  • 还检查了你的答案,我对List&lt;MyClass&gt; countriesList = new Gson().fromJson(jsonArray, listType); 有问题,我认为这是因为 JSONObject 和 JSONArray 是来自 org.json 的类,而“Gson().fromJson”期望拥有 gson 类?无论如何感谢您的回答。
  • 嗯,谢谢,我更改了您的一些代码,它工作得很好,这就是我所做的更改:List&lt;MyClass&gt; countriesList = new Gson().fromJson(jsonArray.toString(), listType); 再次感谢您。
猜你喜欢
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2021-07-21
  • 2020-10-11
相关资源
最近更新 更多