[英]Parsing JSON Object inside Array in Jackson
我正在使用Jackson JSON Processor从JSON获取详细信息,我有以下内容
JSON字串
{
"first_name": "first_name",
"last_name": "last",
"city": "Somewhere",
"user_user": [
{
"id": "1",
"domain": "http://google.com/"
},
{
"id": "34",
"domain": "http://so.com/"
},
{
"id": "42",
"domain": "http://ww.com/"
}
]}
的UserDetails
package com.example.com;
import java.util.List;
public class UserDetails{
private String city;
private String first_name;
private String last_name;
private List<?> user_user;
public String getCity(){
return this.city;
}
public void setCity(String city){
this.city = city;
}
public String getFirst_name(){
return this.first_name;
}
public void setFirst_name(String first_name){
this.first_name = first_name;
}
public String getLast_name(){
return this.last_name;
}
public void setLast_name(String last_name){
this.last_name = last_name;
}
public List<?> getUser_user(){
return this.user_user;
}
public void setUser_user(List<?> user_user){
this.user_user = user_user;
}
}
User_user
package com.example.com;
import java.util.List;
public class User_user{
private String domain;
private String id;
public String getDomain(){
return this.domain;
}
public void setDomain(String domain){
this.domain = domain;
}
public String getId(){
return this.id;
}
public void setId(String id){
this.id = id;
}
}
码
ObjectMapper mapper = new ObjectMapper();
UserDetails userDetails = mapper.readValue(jsonString , UserDetails.class);
System.out.println(userDetails.getFirst_name());
System.out.println(userDetails.getLast_name());
User_user userF = mapper.readValue(jsonString , User_user.class);
for(int i = 0; i < userDetails.getUser_user().size(); i++)
{
System.out.println(userF.getId());
}
从上面的代码无法从User_user
获取ID。
如果我的JSON再次具有数组,如何解析并获取fav_colors
。
我改变了List<?> user_user;
列出< User_user > user_user; 在UserDetails中
根据MichałZiober的建议
之后,我能够轻松检索所有结果,这是代码。
没有那些Sysout ,几乎没有3 lines
。
System.out.println(userDetails.getCity()); //City, FirstName, LastName
for(int i = 0; i < userDetails.getUser_user().size(); i++) {
System.out.println(userDetails.getUser_user().get(i).getId()); // id, domain
try {
for(int k = 0; k < userDetails.getUser_user().get(i).getFav_colors().size(); k++) {
System.out.println(userDetails.getUser_user().get(i).getFav_colors().get(k)); //fav_color
}
}
catch (Exception e) {
System.out.println("NO FAV COLORS");
}
}
也许不是最干净的解决方案,但是我使用Iterator for lists对其进行了测试并且可以正常工作:
ObjectMapper mapper = new ObjectMapper();
UserDetails userDetails = new UserDetails();
try {
userDetails = mapper.readValue(fileReader, UserDetails.class);
System.out.println(userDetails.getFirst_name());
System.out.println(userDetails.getLast_name());
List<User_user> users = new ArrayList<User_user>();
JsonNode rootNode = mapper.readTree(fileReader);
JsonNode usersNode = rootNode.path("user_user");
Iterator<JsonNode> ite = usersNode.elements();
while (ite.hasNext()) {
JsonNode temp = ite.next();
User_user userF = mapper.treeToValue(temp, User_user.class);
JsonNode favNode = temp.path("fav_colors");
List<String> fav_colors = new ArrayList<String>();
Iterator<JsonNode> iter = favNode.elements();
while (iter.hasNext()) {
fav_colors.add(iter.next().asText());
}
userF.setFav_colors(fav_colors);
users.add(userF);
}
userDetails.setUser_user(users);
} catch (JsonProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < userDetails.getUser_user().size(); i++) {
System.out.println(userDetails.getUser_user().get(i).getId());
}
我还修改了UserDetails.class:
public class UserDetails {
private String city;
private String first_name;
private String last_name;
private List<User_user> user_user;
public String getCity() {
return this.city;
}
public void setCity(String city) {
this.city = city;
}
public String getFirst_name() {
return this.first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return this.last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public List<User_user> getUser_user() {
return this.user_user;
}
public void setUser_user(List<User_user> user_user) {
this.user_user = user_user;
}
}
这是带有收藏夹颜色的User_user.class:
public class User_user {
private String domain;
private String id;
public List<String> fav_colors;
public List<String> getFav_colors() {
return fav_colors;
}
public void setFav_colors(List<String> fav_colors2) {
this.fav_colors = fav_colors2;
}
public String getDomain() {
return this.domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
}
对于数组和列表,也请参见以下问题: Jackson-Json到具有多个条目的POJO
回答有关fav_color解析的第二个问题。 我在这里使用json是因为对jackson不太熟悉。 仍然可能对您有帮助。
String[] color = null;
try {
JSONObject obj = new JSONObject("urJsonData");
JSONArray jsonUser = obj.getJSONArray("user_user");
for(int i = 0; i < jsonUser.length(); i++){
JSONObject item = jsonUser.getJSONObject(i);
if(item.toString().contains("fav_colors")){
JSONArray favColors = item.getJSONArray("fav_colors");
color = new String[favColors.length()];
for(int j =0; j < favColors.length(); j++){
color[j] = favColors.getString(j);
}
}
//set ur fav_color color to ur data structure/object
}
} catch (JSONException e) {
Log.e("ERROR", e.toString());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.