【问题标题】:Convert json to Object List将 json 转换为对象列表
【发布时间】:2016-10-12 13:07:58
【问题描述】:

我有以下字符串:

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;
    }

问题是obj List的结果是这样的:

但我需要的 obj List 是这样的:

那么我怎样才能得到需要的列表呢?

【问题讨论】:

    标签: java spring objectmapper


    【解决方案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)
    );
    

    更新

    这是我想出的,并且有效。

    实体测试

    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]
    

    【讨论】:

    • 尝试了提供的“With SlaveEntity”解决方案,但现在我收到此错误:com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name 'defaultReference' at [Source: [{" id”:“0”,“ip”:“123”,“mac”:“456”},{“id”:“1”,“ip”:“111”,“mac”:“222”}] ;行:1,列:1]
    • 解决方案“With Object”给了我最初在这个问题中提供的确切结果。
    • 您是否有超过三个字段没有告诉我们?如果可以,请发布实际 SlaveEntity 课程。
    • @Cristian:我更新了问题。这对我有用——如果您有任何其他问题,它们可能在您的其他课程中,例如。 BaseEntity, PositionEntity, ...
    • 所以@Mr.Polywhirl 你是对的。 PositionEntity 中存在问题,这就是您的方法给我错误的原因。谢谢。
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多