使用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库。

+0

您可以通过编写自定义解串器做到这一点,但不是直接的。 TBH,你描述的情况不应该发生。如果数据只有一个条目,那么它应该是一个有一个条目而不是单个条目的数组。 – theblitz

使用谷歌的gson

喜欢这个

Gson gson = new Gson(); Result result= gson.fromJson(jsonInString, Result.class);

为了您的JSON数据,你应该bean类一样,然后正常解析它:

class Result{ 
      String msg; 
      int status; 
      ArrayList<User> data; 
     } 

     class User{ 
      String name; 
      int age; 
     } 
+0

当'data'是单个对象时这不起作用 –

+0

当数据是数组而不是对象时,这将工作。 –

把你的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; 
    }