我有一个嵌套的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值检索到列表中?
答案 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;
}
}