Java 将json转换为对象列表

Java 将json转换为对象列表,java,spring,objectmapper,Java,Spring,Objectmapper,我有以下字符串: String json = "[{\"id\": \"0\", \"ip\": \"123\", \"mac\": \"456\"}, {\"id\": \"1\", \"ip\": \"111\", \"mac\": \"222\"}]"; 以及一个奴隶实体,该实体具有: public class SlaveEntity extends BaseEntity { private String ip; private String macAddress;

我有以下字符串:

String json = "[{\"id\": \"0\", \"ip\": \"123\", \"mac\": \"456\"}, {\"id\": \"1\", \"ip\": \"111\", \"mac\": \"222\"}]";
以及一个奴隶实体,该实体具有:

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;

}
公共类SlaveEntity扩展了BaseEntity{
私有字符串ip;
私有字符串地址;
私有字符串状态;
@OneToMany(mappedBy=“slave”,targetEntity=PositionEntity.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
私人名单职位;
}
我正在编写一个接受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;
    }
公共静态列表JSONTSLAVENTITY(字符串json){
ObjectMapper ObjectMapper=新的ObjectMapper();
List obj=new ArrayList();
试一试{
obj=objectMapper.readValue(json,List.class);
}捕获(IOE异常){
e、 printStackTrace();
}
返回obj;
}
问题是obj列表的结果如下:

但我需要的obj列表是这样的:


那么如何获得所需的列表呢?

您可以将结果转换为对象列表,也可以传入类型参数而不是
列表

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

更新 这就是我所想到的,它是有效的

实体测试 奴隶身份 结果
尝试了提供的解决方案'With SlaveEntity',但现在我得到了以下错误:com.fasterxml.jackson.databind.JsonMappingException:名为'defaultReference'的多个反向引用属性位于[Source:[{“id”:“0”,“ip”:“123”,“mac”:“456”},{“id”:“1”,“ip”:“111”,“mac”:“222”}];行:1,列:1]“带对象”的解决方案给出了这个问题最初提供的确切结果。您有三个以上的字段没有告诉我们吗?如果可以,请发布实际的
SlaveEntity
类。@Cristian:我更新了问题。这对我很有用——如果您有任何其他问题,它们可能在您的其他类中,例如
BaseEntity
PositionEntity
,…因此@Mr.polywhir您是对的。PositionEntity中存在问题,这就是您的方法给我错误的原因。非常感谢。
List<Object> items = objectMapper.readValue(
    jsonString,
    objectMapper.getTypeFactory().constructParametricType(List.class, Object.class)
);
List<SlaveEntity> items = objectMapper.readValue(
    jsonString,
    objectMapper.getTypeFactory().constructCollectionType(List.class, SlaveEntity.class)
);
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>();
    }
}
public class BaseEntity {
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}
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);
    }
}
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]