首页 > 解决方案 > 使用 JSON 对象反序列化哪些字段可以是不同类型

问题描述

我有以下 json 文件:

{
"authors": 

[{"id":"author7",
"book":[
[
{
"value":{"pages":123}}]]},
{
    "id": "author3",
    "book": [
    [
    {
    "value": {
    "title": "LOTR"
    }
    },
    {
    "value": {
    "boolean": false
    }
    },
    ],
    [
    {
    "value": {
    "pages": 350
    }
    },
    {
    "value": {
    "boolean": false
    }
    },
    ],
    [
    {
    "value": {
    "boolean": false
    }
    },
    {
    "value": {
    "pages": 150
    }
    },
    ]
    ]
    },
}

我希望能够创建 Author 的对象,但是在将 Json 文件与我创建的 Java 类映射时遇到问题。

我知道,在将 json 文件与 java 类映射时,Authors 类应该具有作为字段

public class Authors{
    private String authorId;
    private Book book;
}

课本应该是这样的

public class Book {
        
    private List<Values> values
    
    public Book() {
    }
}

但是类值呢?

public class Values{
        
    private int pages;
    private Boolean bool;
    private String title;

    
    public Values() {
    }
}

这是映射它的正确方法吗?因为我看到如果我创建一个 Values 对象,它会要求我修改构造函数或为来自 Json 的每个不同对象创建一个新的构造函数

感谢您的阅读和帮助!

标签: javajson

解决方案


简单的出路是通过类型“对象”来定义值,

public class Book {           
    private List<Object> values
}

这样,当 JSON 中不存在属性时,您就不会遇到具有空值的属性的问题。此外,即使引入了新属性(或者可能未在 values 类下定义,正如您在上面所做的那样导致那些未映射到对象),JSON 也会被完全解析为对象。

但是,当您使用“对象”时,请注意使用此解析对象的逻辑。虽然,您可以确保像在 JSON 中一样从对象访问属性,但您必须有条件地检查每个逻辑上下文中是否首先存在 nessacary 属性以避免可能的未定义值错误。


推荐阅读