Java 如何使用jackson将json列表序列化到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"}] 每个

以下是我的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"}]
每个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}}