当数组元素可能不同时,将JSON数组转换为Java对象

时间:2014-05-21 15:22:00

标签: java json

当每个数组元素中可能有不同的键值对时,是否有人可以提供有关JSON库或代码片段的建议,该代码片段用于处理将下面的JSON文件转换为Java对象?

{
"tweets": [
    {
        "filter_level": "medium",
        "retweeted_status": {
            "contributors": null,
            "text": "",
            "entities": {
                "symbols": [

                ],
                "urls": [

                ],
                "hashtags": [

                ],
                "user_mentions": [

                ]
            },
            "more data":". . ." 
            "user": {
                "user data":". . .",
                . . .
            },
        },
        "contributors": null,
        "text": "",
        "entities": {
            "symbols": [

            ],
            "urls": [

            ],
            "hashtags": [

            ],
            "user_mentions": [
                {
                    "id": 32943506,
                    "name": "Jazzmen",
                    "indices": [
                        3,
                        17
                    ],
                    "screen_name": "_PumpsAndJays",
                    "id_str": "32943506"
                }
            ]
        },
        "more data":". . .",
        "user": {
                "user data":". . .",
                . . .
            },
    },
    { //BEGIN NEW ELEMENT, As you can see this next element doesn't have the
      "retweeted_status" key, so it's different from the element of the array before.

        "filter_level": "medium",
        "contributors": null,
        "text": "",
        "more data like the last element":". . .", . . .

我想转换一个像这样的json对象,由一组" tweets"组成。每个都有信息,但是当数据因元素而略有不同时,我找不到任何关于案例的文档。在这种特定情况下,元素可以是转发或只是普通的推文。我想知道是否有人知道如何使用Jackson,Google Gson等库进行转换?

我已经对此进行了大量研究,阅读了多个教程,多个解析器库的文档,但找不到这样的内容。

1 个答案:

答案 0 :(得分:0)

最快的方法是使用以下类:

class Tweets {
     public List<Map<String, Object> tweets;
}

使用Jackson并将此类作为所需输出传递将无错误地反序列化JSON,但您需要知道每条推文的字段的确切名称,以便您可以为它们执行.get(“field_name”)。您还需要将值转换为您所知道的值:String,Integer,嵌套对象的Map等。此代码将难以维护。

另一种选择是让Tweet类具有所期望的所有可能值,这些值是您收到的推文对象的所有变体。因此,即使它可能没有为数组中的某些对象提供retweetedStatus,也要添加它。如果输入中没有值,杰克逊只会将该值保留为空。

class Tweets {
     public List<Tweet> tweets;
}

class Tweet {
     String filterLevel;
     RetweetedStatus retweetedStatus;
     String text;
     // + any other fields you may receive and want to deserialize
}

// + any other classes the define nested objects like RetweetedStatus

如果要忽略json中的任何字段,您甚至可以将Jackson配置为忽略未在您的类中映射的字段。

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

或通过注释课程

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDtoIgnoreUnknown { ... }

您还可以使用注释为变量指定不同于json中的名称:

@JsonProperty("retweeted_status")
public RetweetedStatus retweetedStatus

请注意从下划线更改为camelCase