如何使用jackson将json列表序列化为POJO?
问题描述:
以下是其中有2项2 POJO的json名单:如何使用jackson将json列表序列化为POJO?
[{"userEmail":null,"userId":5,"userName":"rahul","userPassword":"asd",}, {"addressId":1,"userApartment":"YSR skyline","userCity":"Bangalore","userId":5,"userLocality":"Venkateshwara Layout","userStreet":"Mahadevapura"}]
每个POJO已经被定义如下:
public class UserLoginDataObj {
private int userId;
private String userName;
private String userEmail;
private String userPassword;
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
} }
和
public class AddAddressObj {
private String userApartment;
private String userStreet;
private String userLocality;
private String userCity;
private int addressId;
private int userId;
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserApartment() {
return userApartment;
}
public void setUserApartment(String userApartment) {
this.userApartment = userApartment;
}
public String getUserStreet() {
return userStreet;
}
public void setUserStreet(String userStreet) {
this.userStreet = userStreet;
}
public String getUserLocality() {
return userLocality;
}
public void setUserLocality(String userLocality) {
this.userLocality = userLocality;
}
public String getUserCity() {
return userCity;
}
public void setUserCity(String userCity) {
this.userCity = userCity;
}}
我需要序列化从JSON到使用JACKSON的这两个POJO类的数据
任何帮助表示赞赏。 在此先感谢。 :)
答
Arpit,
您需要添加更多的类称为用户具有这两个的POJO将被反序列化给你这些类:
package com.yourpackage.model;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.yourpackage.deserializer.UserDeserializer;
@JsonDeserialize(using = UserDeserializer.class)
public class User {
private UserLoginDataObj obj;
private AddAddressObj address;
public UserLoginDataObj getUserLoginDataObj() {
return obj;
}
public void setUserLoginDataObj(UserLoginDataObj obj) {
this.obj = obj;
}
public AddAddressObj getAddAddressObj() {
return address;
}
public void setAddAddressObj(AddAddressObj address) {
this.address = address;
}
}
随着这款类的,现在你可以反序列化使用下面的代码 -
package com.yourpackage.deserializer;
import java.io.IOException;
import java.util.Iterator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.yourpackage.model.AddAddressObj;
import com.yourpackage.model.User;
import com.yourpackage.model.UserLoginDataObj;
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode nodes = oc.readTree(jsonParser);
UserLoginDataObj obj = new UserLoginDataObj();
AddAddressObj address = new AddAddressObj();
for(int i = 0; i < nodes.size(); i++) {
JsonNode node = nodes.get(i);
Iterator<String> fields = node.fieldNames();
boolean isUser = false;
while(fields.hasNext()) {
String field = fields.next();
if(!field.equals("userId")) {
if(field.equals("userEmail") || field.equals("userName") || field.equals("userPassword")) {
isUser = true;
break;
}
}
}
if(isUser) {
String userEmail = "", userName = "", userPassword = "";
int userId = 0;
try {
userEmail = node.get("userEmail").textValue();
} catch(Exception e) {
userEmail = null;
}
try {
userName = node.get("userName").textValue();
} catch(Exception e) {
userName = null;
}
try {
userPassword = node.get("userPassword").textValue();
} catch(Exception e) {
userPassword = null;
}
try {
userId = node.get("userId").intValue();
} catch(Exception e) {
userId = 0;
}
obj.setUserEmail(userEmail);
obj.setUserId(userId);
obj.setUserName(userName);
obj.setUserPassword(userPassword);
} else {
String userApartment = "", userStreet = "", userLocality = "", userCity = "";
int addressId = 0;
int userId = 0;
try {
userApartment = node.get("userApartment").textValue();
} catch(Exception e) {
userApartment = null;
}
try {
userStreet = node.get("userStreet").textValue();
} catch(Exception e) {
userStreet = null;
}
try {
userLocality = node.get("userLocality").textValue();
} catch(Exception e) {
userLocality = null;
}
try {
userCity = node.get("userCity").textValue();
} catch(Exception e) {
userCity = null;
}
try {
addressId = node.get("addressId").intValue();
} catch(Exception e) {
addressId = 0;
}
try {
userId = node.get("userId").intValue();
} catch(Exception e) {
userId = 0;
}
address.setAddressId(addressId);
address.setUserApartment(userApartment);
address.setUserCity(userCity);
address.setUserId(userId);
address.setUserLocality(userLocality);
address.setUserStreet(userStreet);
}
}
User u = new User();
u.setAddAddressObj(address);
u.setUserLoginDataObj(obj);
return u;
}
}
我已经测试了这个代码对你提供的json文件。
答
可以使用JsonFormat
注释将shape
属性设置为JsonFormat.Shape.ARRAY
,以告诉Jackson从here所述的数组项中读取对象属性。
请参阅下面的完整示例。请注意聚合另外两个对象的User
类。
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class JacksonFormArray {
static final String JSON = "[{\"userEmail\":null,\"userId\":5,\"userName\":\"rahul\","
+ "\"userPassword\":\"asd\"}, {\"addressId\":1,\"userApartment\":"
+ "\"YSR skyline\",\"userCity\":\"Bangalore\",\"userId\":5,\"userLocality\""
+ ":\"Venkateshwara Layout\",\"userStreet\":\"Mahadevapura\"}]";
static class UserLoginDataObj {
public int userId;
public String userName;
public String userEmail;
public String userPassword;
@Override
public String toString() {
return "UserLoginDataObj{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userEmail='" + userEmail + '\'' +
", userPassword='" + userPassword + '\'' +
'}';
}
}
static class AddAddressObj {
public String userApartment;
public String userStreet;
public String userLocality;
public String userCity;
public int addressId;
public int userId;
@Override
public String toString() {
return "AddAddressObj{" +
"userApartment='" + userApartment + '\'' +
", userStreet='" + userStreet + '\'' +
", userLocality='" + userLocality + '\'' +
", userCity='" + userCity + '\'' +
", addressId=" + addressId +
", userId=" + userId +
'}';
}
}
@JsonFormat(shape = JsonFormat.Shape.ARRAY)
@JsonPropertyOrder({ "login", "address"})
static class User {
public UserLoginDataObj loging;
public AddAddressObj address;
@Override
public String toString() {
return "User{" +
"loging=" + loging +
", address=" + address +
'}';
}
}
public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(JSON, User.class));
}
}
输出:
User{loging=UserLoginDataObj{userId=5, userName='rahul', userEmail='null', userPassword='asd'}, address=AddAddressObj{userApartment='YSR skyline', userStreet='Mahadevapura', userLocality='Venkateshwara Layout', userCity='Bangalore', addressId=1, userId=5}}
我试图制造具有这些类的名称作为变量,而不是序列化的名字一个POJO。 –
我实际上被卡在这里 –
你是否使用过Google? http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/ – Devrim