android: 从嵌套的 JSON 对象中检索值到列表类型

android: Retrieve values from nested JSON object into List type

我有一个嵌套的 JSON 数组,我需要从中检索嵌套在 Friends.

中的所有 Username 的值
{
    "Friends": [
        {"Username": "abc"},
        {"Username": "xyz"}
    ]
}

获得所有用户名后,我想将其存储在一个列表中,我将使用适配器和 ListView

FriendList.java:

public class FriendList
{
     @SerializedName("Username")
     private String username;

     public String getUsername() 
     {
         return username;
     }

     public void setUsername(String username) 
     {
         this.username = username;
     }
}

这是我到目前为止编写的代码:

if (httpResult != null && !httpResult.isEmpty()) //POST API CALL
{
   Type listType = new TypeToken<List<FriendList>>() {}.getType();

   List<FriendList> friendList = new Gson().fromJson(httpResult, listType);

   FLCustomAdapter adapter = new FLCustomAdapter(getActivity(), friendList);

   mainFriendsListView.setAdapter(adapter);
}

但是,出现错误:无法反序列化 Json 对象。

请建议,应该对它做什么 additions/changes,以便我可以将嵌套的 JSON 值检索到列表中?

简单Json解析会是这样

JSONObject params=new JSONObject(httpResult);
JSONObject params1=params.getJsonObject("Friends");
JsonArray array=params1.getJsonArray();

for(int i=0;i<array.length();i++)
{
String userName=array.getJsonObject(i).getString("UserName");
// Do whatever you want to do with username
}

以下代码在不使用任何 GSON 的情况下运行良好,请尝试。

String jsonString = "Your Json Data";
  JSONObject  jsonRootObject = new JSONObject(jsonString );  
JSONArray friendsArray = jsonRootObject .getJSONArray("Friends");

ArrayList<FriendList > friendsList = new ArrayList<FriendList >();


for(int friendsLen = 0 ;friendsLen  < friendsArray .length() ; friendsLen ++){
FriendList userNameObj = new UserName();
JSONObject jsonObj = jsonRootObject.getJSONObject(friendsLen )  ;
String Username = jsonObj.getString("Username"); 
userNameObj .setUserName(Username ); 
friendsList .add(userNameObj );
}

现在friendsList你想要的列表。

使用 GSON 的解决方案。

你需要两个 class 来解析这个。

FriendList 和 UsernameDao。

public class UsernameDao {
  @SerializedName("Username")
  private String username;

  //get set methods
}

List<FriendList> friendList = new Gson().fromJson(httpResult, listType);

这行不通,因为它希望您的整个 JSON 文档只是 FriendList 元素的数组(顺便说一下,为什么 "FriendList"?):[{"Username": "abc"},{"Username": "xyz"}] -- 这是您的方法可以解析的内容。

解决此问题的最简单解决方案(除了更难实现但更有效的流式读取以剥离可能不必要的属性之外)只是创建正确的映射:

final class Wrapper {

    @SerializedName("Friends")
    final List<Friend> friends = null;

}
final class Friend {

    @SerializedName("Username")
    final String username = null;

}

现在反序列化是微不足道的,你不必定义类型标记,因为 Gson 从 Wrapper.friends 字段中获得了足够的类型信息:

final Wrapper wrapper = gson.fromJson(response, Wrapper.class);
for ( final Friend friend : wrapper.friends ) {
    System.out.println(friend.username);
}

输出:

abc
xyz

改变List<FriendList> friendList = new Gson().fromJson(httpResult, listType);

 FriendList friends = new Gson().fromJson(httpResult, listType);
 List<Friend> friends = friends.list;

已更新 FriendList.java 如下所述

FriendList.java

public class FriendList
{
     @SerializedName("Friends")
     public List<Friend> list;
}

Friend.java

public class Friend
{
     @SerializedName("Username")
     private String username;

     public String getUsername() 
     {
         return username;
     }

     public void setUsername(String username) 
     {
         this.username = username;
     }
}

首先,你必须了解这个Json的结构。 可以看到,里面有

1。一个 json 个对象

2。此 json 对象包含一个 json 数组,该数组可以包含多个不同的 json 对象或 json 数组。 在本例中,它包含 json 个对象。

正在解析:

首先获取Json对象

  try{
    JSONObject jsonObject=new JSONObject(jsonResponse);
    if(jsonObject!=null){
    //get the json array
    JSONArray jsonArray=jsonObject.getJSONArray("Friends");
    if(jsonArray!=null){
    ArrayList<FriendList> friendList=new ArrayList<FriendList>();
    //iterate your json array
    for(int i=0;i<jsonArray.length();i++){
    JSONObject object=jsonArray.getJSONObject(i);
    FriendList friend=new FriendList();
    friend.setUserName(object.getString(Username));
    friendList.add(friend);
    }
    }
    }
    }
    catch(JSONException ex){
    ex.printStackTrace();
    }

希望对你有所帮助