【问题标题】:How do I parse a JSON array into different objects using Jackson on Android?如何在 Android 上使用 Jackson 将 JSON 数组解析为不同的对象?
【发布时间】:2014-08-13 19:15:14
【问题描述】:

我正在尝试使用 Android 上的 Jackson 将如下 JSON 解析为对象(注意:我无法控制 JSON 格式 - 格式来自 Yammer)

"references": [
    {
        "type": "user",
        "id": 12345678,
        "name": "Wex"
    },
    {
        "type": "message",
        "id": 12345679,
        "body":
        {
            "plain":"A short message"
        }
    },
    {
        "type": "thread",
        "id": 12345670,
        "thread_starter_id": 428181699
    }
]

问题在于references 中的每个条目都是具有不同属性的不同类型的对象。作为一个开始,我有:

public static class Reference
{
    public String type;
    public String id;
}

我宁愿避免将所有潜在属性放在一个对象中,例如:

public static class Reference
{
    public static class Body
    {
        public String plain;
    }
    public String type;
    public String id;
    public String name;
    public Body body;
    public String thread_starter_id;
}

并且想要使用依赖于 type 值创建的单独类,例如:

public static class ReferenceUser extends Reference
{
    public String name;
}

public static class ReferenceMessage extends Reference
{
    public static class Body
    {
        public String plain;
    }
    public Body body;
}

public static class ReferenceThread extends Reference
{
    public String thread_starter_id;
}

那么...让 Jackson 像这样解析 JSON 的最佳方法是什么?

我目前正在像这样简单地解析它:

ObjectMapper mapper = new ObjectMapper();
Reference[] references = mapper.readValue(json, Reference[].class);

【问题讨论】:

    标签: java android json jackson yammer


    【解决方案1】:

    你可以用杰克逊做这样的事情:

    @JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "type")
    @JsonSubTypes({
        @JsonSubTypes.Type(name = "user", value = ReferenceUser.class),
        @JsonSubTypes.Type(name = "message", value = ReferenceMessage.class),
        @JsonSubTypes.Type(name = "thread", value = ReferenceThread.class)
    })
    
    public class Reference {
        int id;
        String name;
    }
    

    这样您将生成子类。

    约翰

    【讨论】:

    • 你只是在@JsonSubTypes的末尾缺少})
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    相关资源
    最近更新 更多