我通过点击网址获得了一些json响应。我想用jackson来解析json的响应。我尝试使用对象Mapper但我得到了异常。
JSON:
{
"contacts": [
{
"id": "c200",
"name": "ravi raja",
"email": "raja@gmail.com",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
},
{
"id": "c201",
"name": "Johnny Depp",
"email": "johnny_depp@gmail.com",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
},
]
}
POJO:
public class ContactPojo {
String name,email,gender,mobileno;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getMobileno() {
return mobileno;
}
public void setMobileno(String mobileno) {
this.mobileno = mobileno;
}
}
代码:
ObjectMapper mapper=new ObjectMapper();
userData=mapper.readValue(jsonResponse,ContactPojo.class);
答案 0 :(得分:7)
正如我所看到的,你的json不是数组,而是包含一个包含数组的对象的对象,所以你需要创建一个临时的数据持有者类,让Jackson解析它。
private static class ContactJsonDataHolder {
@JsonProperty("contacts")
public List<ContactPojo> mContactList;
}
public List<ContactPojo> getContactsFromJson(String json) throws JSONException, IOException {
ContactJsonDataHolder dataHolder = new ObjectMapper()
.readValue(json, ContactJsonDataHolder.class);
// ContactPojo contact = dataHolder.mContactList.get(0);
// String name = contact.getName();
// String phoneNro = contact.getPhone().getMobileNro();
return dataHolder.mContactList;
}
对你的班级进行一些调整:
@JsonIgnoreProperties(ignoreUnknown=true)
public class ContactPojo {
String name, email, gender;
Phone phone;
@JsonIgnoreProperties(ignoreUnknown=true)
public static class Phone {
String mobile;
public String getMobileNro() {
return mobile;
}
}
// ...
public Phone getPhone() {
return phone;
}
@JsonIgnoreProperties(ignoreUnknown = true)注释确保当您的类不包含json中的属性时,您不会获得异常,例如json中的address
可以给出异常,或Phone对象中的home
。
答案 1 :(得分:3)
我总是使用jsonschema2pojo.org创建我的Model / Pojo类!
您需要提供您的json数据,并根据该数据为您创建pojo / Model类!很酷!
答案 2 :(得分:-1)
示例Json数据
{
"records": [
{"field1": "outer", "field2": "thought"},
{"field2": "thought", "field1": "outer"}
] ,
"special message": "hello, world!"
}
您需要在assert forder中存储sample.json,然后代码
try
{
InputStreamReader foodDataIn = new InputStreamReader(getAssets().open("sample.json"));
ObjectMapper mapper = new ObjectMapper();
JsonParser jp = mapper.getFactory().createParser(foodDataIn);
JsonToken current;
current = jp.nextToken();
if (current != JsonToken.START_OBJECT) {
System.out.println("Error: root should be object: quiting.");
return;
}
while (jp.nextToken() != JsonToken.END_OBJECT) {
String fieldName = jp.getCurrentName();
// move from field name to field value
current = jp.nextToken();
System.out.println("NAme: " +fieldName);
if (fieldName.equals("records")) {
if (current == JsonToken.START_ARRAY) {
// For each of the records in the array
while (jp.nextToken() != JsonToken.END_ARRAY) {
// read the record into a tree model,
// this moves the parsing position to the end of it
JsonNode node = jp.readValueAsTree();
// And now we have random access to everything in the object
System.out.println("field1: " + node.get("field1").asText());
System.out.println("field2: " + node.get("field2").asText());
}
} else {
System.out.println("Error: records should be an array: skipping.");
jp.skipChildren();
}
} else {
System.out.println("Unprocessed property: " + fieldName);
jp.skipChildren();
}
}
} catch (IOException e) {
e.printStackTrace();
}