Преобразование json в список объектов

#java #spring #objectmapper

#java #spring #objectmapper

Вопрос:

У меня есть следующая строка:

 String json = "[{"id": "0", "ip": "123", "mac": "456"}, {"id": "1", "ip": "111", "mac": "222"}]";
  

И объект SlaveEntity, который имеет:

 public class SlaveEntity extends BaseEntity {

    private String ip;
    private String macAddress;
    private String status;

    @OneToMany(mappedBy="slave", targetEntity = PositionEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<PositionEntity> positions;

}
  

Я пишу метод, который принимает json и возвращает список SlaveEntity:

 public static List<SlaveEntity> JsonToSlaveEntity(String json) {
        ObjectMapper objectMapper = new ObjectMapper();
        List<SlaveEntity> obj = new ArrayList<SlaveEntity>();

        try {
           obj = objectMapper.readValue(json, List.class);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return obj;
    }
  

Проблема в том, что список объектов выглядит следующим образом:

введите описание изображения здесь

Но мне нужно, чтобы список объектов был таким:

введите описание изображения здесь

Итак, как я могу получить необходимый список?

Ответ №1:

Вы можете преобразовать результат в список объектов или передать параметр типа вместо List класса.

 String jsonString = "[{"id": "0", "ip": "123", "mac": "456"}, {"id": "1", "ip": "111", "mac": "222"}]";
  

С помощью Object

 List<Object> items = objectMapper.readValue(
    jsonString,
    objectMapper.getTypeFactory().constructParametricType(List.class, Object.class)
);
  

С помощью SlaveEntity

 List<SlaveEntity> items = objectMapper.readValue(
    jsonString,
    objectMapper.getTypeFactory().constructCollectionType(List.class, SlaveEntity.class)
);
  

Обновить

Это то, что я придумал, и это работает.

EntityTest

 import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;

public class EntityTest {
    public static void main(String[] args) {
        String json = "[{"id": "0", "ip": "123", "mac": "456"}, {"id": "1", "ip": "111", "mac": "222"}]";

        for (SlaveEntity entity : jsonToSlaveEntity(json)) {
            System.out.println(entity);
        }
    }

    public static List<SlaveEntity> jsonToSlaveEntity(String json) {
        ObjectMapper objectMapper = new ObjectMapper();

        try {
           return objectMapper.readValue(
                   json,
                objectMapper.getTypeFactory().constructCollectionType(List.class, SlaveEntity.class)
            );

        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ArrayList<SlaveEntity>();
    }
}
  

BaseEntity

 public class BaseEntity {
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}
  

SlaveEntity

 import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

import com.fasterxml.jackson.annotation.JsonProperty;

public class SlaveEntity extends BaseEntity {
    private String ip;

    @JsonProperty("mac")
    private String macAddress;

    private String status;

    @OneToMany(mappedBy = "slave", targetEntity = PositionEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<PositionEntity> positions;

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getMacAddress() {
        return macAddress;
    }

    public void setMacAddress(String macAddress) {
        this.macAddress = macAddress;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public List<PositionEntity> getPositions() {
        return positions;
    }

    public void setPositions(List<PositionEntity> positions) {
        this.positions = positions;
    }

    @Override
    public String toString() {
        return String.format(
                "SlaveEntity [id=%d, ip=%s, mac=%s, status=%s, positions=%s]",
                getId(), ip, macAddress, status, positions);
    }
}
  

PositionEntity

 public class PositionEntity {
    // ?
}
  

Результат

 SlaveEntity [id=0, ip=123, mac=456, status=null, positions=null]
SlaveEntity [id=1, ip=111, mac=222, status=null, positions=null]
  

Комментарии:

1. Попробовал решение «С помощью SlaveEntity», но теперь я получаю эту ошибку: com.fasterxml.jackson.databind. Исключение JsonMappingException: несколько свойств обратной ссылки с именем ‘defaultReference’ в [Источник: [{«id»: «0», «ip»: «123», «mac»: «456»}, {«id»: «1», «ip»: «111»,»mac»: «222»}]; строка: 1, столбец: 1]

2. Решение «С объектом» дает мне точные результаты, предоставленные изначально в этом вопросе.

3.У вас есть более трех полей, о которых вы нам не говорите? Пожалуйста, опубликуйте фактический SlaveEntity класс, если сможете.

4. @Cristian: Я обновил вопрос. Это работает для меня — если у вас есть какие-либо другие проблемы, они могут быть в других ваших классах, например. BaseEntity , PositionEntity , …

5. итак, @Mr.Polywhirl вы правы. В PositionEntity возникла проблема, и именно по этой причине ваш метод выдал мне ошибку. Спасибо.