【问题标题】:How to deserialize the following json so that the items would use english attributes?如何反序列化以下 json 以便项目使用英文属性?
【发布时间】:2021-10-17 09:31:12
【问题描述】:

我拥有的 json 是 lighthouses.json

{
    "count": 3,
    "results": [
        {"tunnus": 2718, "nimi": "Bengtskar", "sijainti": "Rosala", "korkeus": "52"}, 
        {"tunnus": 1015, "nimi": "Soderskar", "sijainti": "Porvoo", "korkeus": "48"}, 
        {"tunnus": 2183, "nimi": "Norreskar", "sijainti": "Loimaa", "korkeus": "21"}, 
    ]
}

我希望项目映射到类

public class Lighthouse {
    
    private int id;
    private String name;
    private String location;
    private int height;
    
    public Lighthouse() {}
       
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getLocation() { return location; }
    public void setLocation(String location) { this.location = location; }

    public int getHeight() { return height; }
    public void setHeight(int height) { this.height = height; }
}

【问题讨论】:

    标签: java jackson objectmapper


    【解决方案1】:

    关于您的 json 文件,您对 "results" 标记的部分感兴趣,可以借助 readTreetreeToValue 方法将其反序列化为 Lighthouse 数组:

    ObjectMapper mapper = new ObjectMapper();
    JsonNode tree = mapper.readTree(json).get("results");
    Lighthouse[] lighthouses = mapper.treeToValue(tree, Lighthouse[].class);
    

    您的 Lighthouse 类必须将 json 文件中的字段与具有不同名称的相应类字段映射到 JsonProperty 注释:

    public class Lighthouse {
        @JsonProperty("tunnus")
        private int id;
        @JsonProperty("nimi")
        private String name;
        @JsonProperty("sijainti")
        private String location;
        @JsonProperty("korkeus")
        private int height;
    }
    

    【讨论】:

    • 感谢您的回答。我可以在自定义 Lighthouse 反序列化器中使用相同的想法吗?
    • @TimoKälviäinen 欢迎您,Lighthouse 类将始终保持不变,您能否提供有关涉及自定义 Lighthouse 反序列化器的场景的其他详细信息?
    • 我在考虑也有一个具有计数和 ArrayList 属性的 Lighthouses 类并读取 json 有点像 ObjectMapper mapper = new ObjectMapper();灯塔灯塔 = mapper.readValue(file, Lighthouses.class);但我想我也应该在一个模块中注册我的 Lighthouse Deserializer。并在调用映射器的 readValue 方法之前在对象映射器中注册模块。
    • 使用public class Lighthouses {private int count; private List<Lighthouse>results;},您的代码可以正常工作,无需反序列化器。
    • JsonProperty 注解完美解决了我的问题。我试过了,注意到序列化我的对象时,json 属性是用原始的芬兰属性命名的。完美!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多