如何反序列化没有字段名的 JSON

Posted

技术标签:

【中文标题】如何反序列化没有字段名的 JSON【英文标题】:how to deserealize JSON without field names 【发布时间】:2022-01-19 22:15:34 【问题描述】:

我调用了一个返回 JSON 的 REST 服务,我正在尝试对其进行反序列化(将其转换为实体),但问题是它没有匹配的字段名称。 JSON 是这样的:


    "text1": "",
    "text2": null,
    "days": [
        
            "20211217": 
                "07:00": 
                    "id": "1187067",
                    "cupo": 9
                ,
                "08:00": 
                    "id": "1187068",
                    "cupo": 10
                
            
        ,
        
            "20211219": 
                "07:00": 
                    "id": "1187077",
                    "cupo": 10
                ,
                "08:00": 
                    "id": "1187078",
                    "cupo": 10
                
            
            
        
    ]

您可以看到它有一些字段,如 text1、text2、days、id 和 cupo,问题是如何映射日期文本 (20211217,20211219) 和小时文本。我该如何操作这些数据?

【问题讨论】:

你的预期输出是什么? 放入地图 你在使用像 Gson 或 Jackson 这样的库吗? 我正在使用杰克逊。也许我没有解释清楚,那些日期和小时字段是随机的。我想把这些数据放在一个实体中,该实体有一个日期字段和一个带有小时、id 和 cupo 的列表 自己动手吧。加载 JSON,遍历原始结果,并将适当的位填充到适当的位置。这样做可能比击败某些框架提交“为你做”要快得多。 【参考方案1】:

您可以按如下方式对 JSON 进行建模:

import java.util.List;
import java.util.Map;

public class YourClass 
    private String text1;
    private String text2;
    private List<Map<String, Map<String, YourOtherClass>>> days;

    public YourClass(String text1, String text2, List<Map<String, Map<String, YourOtherClass>>> days) 
        this.text1 = text1;
        this.text2 = text2;
        this.days = days;
    

    public String getText1() 
        return text1;
    

    public void setText1(String text1) 
        this.text1 = text1;
    

    public String getText2() 
        return text2;
    

    public void setText2(String text2) 
        this.text2 = text2;
    

    public List<Map<String, Map<String, YourOtherClass>>> getDays() 
        return days;
    

    public void setDays(List<Map<String, Map<String, YourOtherClass>>> days) 
        this.days = days;
    

然后将另一个类建模idcupo如下:

public class YourOtherClass 
    private String id;
    private int cupo;

    public YourOtherClass(String id) 
        this.id = id;
    

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

    public int getCupo() 
        return cupo;
    

    public void setCupo(int cupo) 
        this.cupo = cupo;
    

【讨论】:

以上是关于如何反序列化没有字段名的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jackson json 注释枚举字段以进行反序列化

检测反序列化的对象是不是缺少 Json.NET 中 JsonConvert 类的字段

如何反序列化包含 GSON 库生成的 LocalDate 字段的 JSON

如何在没有jackson注释的情况下忽略反序列化的某些字段?

C#动态实体集的反序列化(动态JSON反序列化)

如何使用 ISO 8601 格式的 DateTime 字段将 JSON 文本反序列化为 BsonDocument?