2

假设我有这个 JSON 示例:

{
    "title" : "tttt",
    "custom" : {
        "a" : "aaaaa",
        "b" : "bbbbb",
        "c" : { 
            "d" : "dddd"
        }
    }
}

我想将其反序列化为以下类:

public class Article {
    private String title;
    private String custom;

    public void setTitle(String title) { this.title = title; }
    public String getTitle() { return title; }
    public void setCustom(String custom) { this.custom = custom; }
    public String getCustom() { return custom; }        
}

我想要的结果是标题按正常反序列化,但“自定义”下的 json 子树不反序列化并设置为原始 json 字符串:

ObjectMapper mapper = new ObjectMapper();
Article article = mapper.readValue(content, Article.class);
assertEquals(article.getTitle(), "tttt");
assertEquals(article.getCustom(),
   "{\"a\" : \"aaaaa\","        +
        "\"b\" : \"bbbbb\","    +
        "\"c\" : {"             + 
            "\"d\" : \"dddd\" " +
        "}"                     +
    "}"); 

另一个重要注意事项是,我无法将自定义节点下的原始 JSON 更改为使用转义 json,因此它将被视为字符串。

4

3 回答 3

3

我找到了一个更简单的方法。您可以添加到您的 dto 下一个二传手:

public void setCustom(JsonNode custom) { this.custom = custom.toString(); }

并获得简单的字符串注释@JsonRawValue

于 2015-02-20T11:07:20.610 回答
2

您必须为您的课程编写新的反序列化程序。它可能看起来像这样:

class ArticleJsonDeserializer extends JsonDeserializer<Article> {

    @Override
    public Article deserialize(JsonParser parser, DeserializationContext context)
            throws IOException, JsonProcessingException {
        RawArticle rawArticle = parser.readValueAs(RawArticle.class);

        return rawArticle.toArticle();
    }

    private static class RawArticle {
        public String title;
        public JsonNode custom;

        Article toArticle() {
            Article article = new Article();
            article.setTitle(title);
            article.setCustom(custom.toString());

            return article;
        }
    }
}

你的Article班级应该是这样的:

@JsonDeserialize(using = ArticleJsonDeserializer.class)
class Article {
   ....
}

现在您可以轻松地将 JSON 反序列化为Article类。

于 2013-10-18T00:27:13.277 回答
1

您可以编写自定义Deserializer.

参考这个SO 问题

于 2013-10-17T23:09:26.813 回答