如何读取 JSON 到 java 中的通用对象列表?
How to read JSON to a list of generic objects in java?
我必须从 Web 服务获取数据,我使用的是 Jackson,但我在使用 Gson 时遇到了同样的问题,我对单个对象没有问题,但是当我收到多个对象列表时,这对我来说并不容易.
JSON收到的是这样的:
{"country":
[
{"code":"AD","nombre":"Andorra","name":"Andorra"},
{"code":"AE","nombre":"Emiratos Árabes Unidos","name":"United Arab Emirates"}
]
}
这是我自己的列表 class CountryWSType
,我有几个这样的 class,需要一种方法来获取其中任何类型的列表。
我试过像列表一样解析它:
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:
解析 class
@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 class,对于我的误解,我们深表歉意。
这可能会有所帮助:
//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 数组元素可以是不同的类型,那么映射器将不知道要实例化哪种类型的 class,你将需要在你的 json 表示,如果 json 是面向外部的,这是一种丑陋的方法。但是,如果这是你想要的,而不是 this SO post.
中的解释
我必须从 Web 服务获取数据,我使用的是 Jackson,但我在使用 Gson 时遇到了同样的问题,我对单个对象没有问题,但是当我收到多个对象列表时,这对我来说并不容易.
JSON收到的是这样的:
{"country":
[
{"code":"AD","nombre":"Andorra","name":"Andorra"},
{"code":"AE","nombre":"Emiratos Árabes Unidos","name":"United Arab Emirates"}
]
}
这是我自己的列表 class CountryWSType
,我有几个这样的 class,需要一种方法来获取其中任何类型的列表。
我试过像列表一样解析它:
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:
解析 class@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 class,对于我的误解,我们深表歉意。
这可能会有所帮助:
//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 数组元素可以是不同的类型,那么映射器将不知道要实例化哪种类型的 class,你将需要在你的 json 表示,如果 json 是面向外部的,这是一种丑陋的方法。但是,如果这是你想要的,而不是 this SO post.
中的解释