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();
}
希望对你有所帮助
我有一个嵌套的 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();
}
希望对你有所帮助