使用JSON解析对象或数组从服务器
我的JSON数据可能包含对象或数组是这样的:使用JSON解析对象或数组从服务器
{
msg:'',
status:0,
data:{
name:'x',
age:2
}
}
或
{
msg:'',
status:0,
data:[{
name:'x',
age:2
},{
name:'y',
age:1
}]
}
我的豆:
class Result<T>{
String msg;
int status;
T data;
}
class User{
String name;
int age;
}
现在如何使用JSON来相应地解析数据?类User
这里只是其中的一个bean,还有其他类型的服务器返回的bean。
顺便说一句,我正在使用Android库。
为了您的JSON数据,你应该bean类一样,然后正常解析它:
class Result{
String msg;
int status;
ArrayList<User> data;
}
class User{
String name;
int age;
}
当'data'是单个对象时这不起作用 –
当数据是数组而不是对象时,这将工作。 –
把你的JSON响应here并在url源文件中选择:json,注释样式:Gson
,然后尝试ModelName name = new Gson().fromJson("Json String",ModelName.class);
如果你知道<T>
在每一个具体的例子(你应该),你只需要能够使用TypeToken
s内轻松创建ParameterizedType
S:
private static final Gson gson = new Gson();
private static final Type userType = new TypeToken<Result<User>>() {
}.getType();
private static final Type userListType = new TypeToken<Result<List<User>>>() {
}.getType();
public static void main(final String... args)
throws IOException {
final String withObjectJson = getPackageResourceString(Q43658341.class, "with-object.json");
final String withMultipleJson = getPackageResourceString(Q43658341.class, "with-array.json");
final Result<User> user = gson.fromJson(withObjectJson, userType);
dumpUsers(singletonList(user.data));
final Result<List<User>> multipleUsers = gson.fromJson(withMultipleJson, userListType);
dumpUsers(multipleUsers.data);
}
private static void dumpUsers(final Iterable<User> users) {
for (final User u : users) {
System.out.println(u.name);
}
}
注意Type
实例可以被视为常量并创建一次,以及Gson
实例可以。
在情况下,如果你想“对齐”值列表,那么你可能在Retrofit and Gson: parsing array/element-polymorphic objects感兴趣:
class Result<E> {
String msg;
int status;
@JsonAdapter(AlwaysListTypeAdapterFactory.class) List<E> data;
}
我认为你无法预知什么形式的回应是,它是动态的 - 有时单对象,有时候是一个列表。简单的解决方案是第一家门店只是一个JsonElement
:
class Result{
String msg;
int status;
JsonElement data;
}
您可以通过编写自定义解串器做到这一点,但不是直接的。 TBH,你描述的情况不应该发生。如果数据只有一个条目,那么它应该是一个有一个条目而不是单个条目的数组。 – theblitz