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

时间:2017-04-18 11:29:51

标签: android android-json gson

我有一个嵌套的JSON数组,我需要从中检索嵌套在Username内的所有Friends的值。

{
    "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对象。

请建议,应该对它进行哪些添加/更改,以便我可以将嵌套的JSON值检索到列表中?

6 个答案:

答案 0 :(得分:2)

使用GSON解决方案。

你需要两个类来解析它。

FriendList和UsernameDao。

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

  //get set methods
}

答案 1 :(得分:2)

首先,你必须了解这个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();
    }
希望,它会帮助你。

答案 2 :(得分:1)

简单的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
}

答案 3 :(得分:1)

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

<input type="text" style="width: 40% !important;" placeholder="Nom" class="input-sm"  ng-model="company.link.nom"  />
<input type="text" style="width: 40% !important;" placeholder="Lien" class="input-sm"  ng-model="company.link.value"  />
<a class="btn btn-wide btn-primary" ng-click="company.addExternalLinktoGrid()"><i class="fa fa-plus"></i> Ajouter </a>

现在,朋友列出你想要的列表。

答案 4 :(得分:1)

  

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

这不起作用,因为它希望你的整个JSON文档只是一个FriendList元素的数组(顺便说一下,为什么&#34; FriendList&#34;?):[{"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

答案 5 :(得分:0)

更改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;
     }
}