#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 возникла проблема, и именно по этой причине ваш метод выдал мне ошибку. Спасибо.