Java 如何使用jackson将json列表序列化到POJO?
以下是我的json列表,其中包含2个POJO条目:Java 如何使用jackson将json列表序列化到POJO?,java,json,jackson,Java,Json,Jackson,以下是我的json列表,其中包含2个POJO条目: [{"userEmail":null,"userId":5,"userName":"rahul","userPassword":"asd",}, {"addressId":1,"userApartment":"YSR skyline","userCity":"Bangalore","userId":5,"userLocality":"Venkateshwara Layout","userStreet":"Mahadevapura"}] 每个
[{"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;
} }
及
我需要使用JACKSON将json中的数据序列化到这两个POJO类
感谢您的帮助。
提前感谢。:) arbit
您需要再添加一个名为User的类,该类具有以下两个POJO,这两个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;
}
}
package com.yourpackage.deserializer;
导入java.io.IOException;
导入java.util.Iterator;
导入com.fasterxml.jackson.core.JsonParser;
导入com.fasterxml.jackson.core.JsonProcessingException;
导入com.fasterxml.jackson.core.ObjectCodec;
导入com.fasterxml.jackson.databind.DeserializationContext;
导入com.fasterxml.jackson.databind.JsonDeserializer;
导入com.fasterxml.jackson.databind.JsonNode;
导入com.yourpackage.model.AddAddressObj;
导入com.yourpackage.model.User;
导入com.yourpackage.model.userlogindaobj;
公共类UserDeserializer扩展JsonDeserializer{
@凌驾
公共用户反序列化(JsonParser、JsonParser、DeserializationContext、DeserializationContext)抛出IOException、JsonProcessingException{
ObjectCodec oc=jsonParser.getCodec();
JsonNode nodes=oc.readTree(jsonParser);
UserLoginDaobj=新的UserLoginDaobj();
AddAddressObj地址=新的AddAddressObj();
对于(int i=0;i
我已针对您提供的json文件测试了此代码。您可以使用
JsonFormat
注释将shape
属性设置为JsonFormat.shape.ARRAY
以告知Jackson按照所述从数组项读取对象属性
请参见下面的完整示例。注意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,把这些类的名称作为变量,但不序列化。我真的被困在这里了,你用谷歌搜索过了吗?我知道如何将普通json转换为POJO,但是这个json有一个包含两个json的列表,上面给出了它们的POJO。我希望列表中的每个json都映射到各自的POJO
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}}