Как конвертировать ниже JSON в POJO, используя ObjectMapper of Jackson - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь использовать приведенный ниже код для преобразования ниже JSON в POJO, используя класс Джексона ObjectMapper, но это исключение.Может ли кто-нибудь помочь мне решить эту проблему.На самом деле JSON предоставляется пользовательским интерфейсом, поэтому не может изменить его формат.Мне нужно проанализировать этот JSON в java-объект, используя библиотеку Джексона.

JSON: data.json

{
    "0": {
        "location": "6",
        "userType": "1",
        "isActive": "1",
        "userId": "Shailesh@gmail.com"
    },
    "1": {
        "location": "7",
        "userType": "2",
        "isActive": "1",
        "userId": "Vikram@gmail.com"
    }
}

DTO:

public class UsersList {
    List<UserDetails> users;
}

public class UserDetails {
    private String userId;
    private String location;
    private String userType;
    private String isActive;

    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public String getUserType() {
        return userType;
    }
    public void setUserType(String userType) {
        this.userType = userType;
    }
    public String getIsActive() {
        return isActive;
    }
    public void setIsActive(String isActive) {
        this.isActive = isActive;
    }
}

Тестовый класс: HandlerUtil

import java.io.IOException;
import java.io.InputStream;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mcmcg.ams.lambda.model.UserDetails;

public class HandlerUtil {
    private static final Logger LOG = LogManager.getLogger(HandlerUtil.class);

    private HandlerUtil() {
    }

    public static void main(String[] args) {
        try (InputStream instream = HandlerUtil.class.getClassLoader().getResourceAsStream("data.json")) {
            UserDetails sample = new ObjectMapper().readValue(instream, UsersList.class);
            System.out.println(sample.toString());
        } catch (IOException ex) {
            LOG.error("Exception occurred while laoding data.json file : ", ex);
        }
    }
}

Исключение: com.fasterxml.jackson.databind.JsonMappingException: нет содержимого для сопоставления из-за окончания-of-вход

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Во-первых, прежде чем вы сможете десериализовать вашу строку json в DTO, DTO должны содержать конструктор без аргументов, геттеры и сеттеры. Ваши правильные DTO будут соответствовать строке, подобной приведенной ниже.

{
    "users": [
        {
            "location": "6",
            "userType": "1",
            "isActive": "1",
            "userId": "Shailesh@gmail.com"
        },
        {
            "location": "7",
            "userType": "2",
            "isActive": "1",
            "userId": "Vikram@gmail.com"
        }
    ]
}

DTO, который будет соответствовать приведенному выше примеру строки, будет выглядеть следующим образом.

public class UsersList {
    UserDetails zero;
    UserDetails one;

    public UsersList() {
    }

    public UserDetails getZero() {
        return zero;
    }

    public void setZero(final UserDetails zero) {
        this.zero = zero;
    }

    public UserDetails getOne() {
        return one;
    }

    public void setOne(final UserDetails one) {
        this.one = one;
    }
}
0 голосов
/ 13 марта 2019

JSON имеет формат Map<String, UserDetails>, посмотрите, ключ 0 имеет пользователя "Shailesh@gmail.com" и ключ 1 с "Vikram@gmail.com"

TypeReference<HashMap<String,UserDetails>> typeRef 
        = new TypeReference<HashMap<String,UserDetails>>() {};

HashMap<String,UserDetails> sample = new ObjectMapper()
                                  .readValue(instream, typeRef);

При использованииДжексон использовать @JsonAnySetter

public class UsersList {

private Map<String, UserDetails> users = new HashMap<>();

@JsonAnySetter
public void setUsers(String name, UserDetails value) {
this.addressDetails.put(name, value);
    }

 }

А затем сопоставить его с UserDetails

 UserDetails sample = new ObjectMapper().readValue(instream, UsersList.class);
...