4

是否可以将杰克逊配置为始终将序列化对象的类型添加到生成的 json 输出中。

例如:

package org.acme;

class ClassA
{
    String a;
    String b;
}

我希望生成的 json 为: ["org.acme.ClassA",{"a":"str1","b":"str2"}]

4

2 回答 2

7

您可以使用 ObjectMapper 的 enableDefaultTyping() 来做到这一点

例如

mapper.enableDefaultTyping(DefaultTyping.OBJECT_AND_NON_CONCRETE);

请参阅ObjectMapper API

于 2013-10-10T06:17:37.090 回答
2

如果您可以自由地从 Jackson 更改并且不需要与您展示的格式相匹配的格式,您可以尝试 Genson http://code.google.com/p/genson

例如,如果您的要求是能够基于您序列化的对象的原始类型来反序列化接口或抽象类,您可以这样做:

interface Entity {}
static class Person implements Entity {}

Genson genson = new Genson.Builder().setWithClassMetadata(true).create();
// json will be equal to {"@class":"my.package.Person"}
String json = genson.serialize(new Person());

// and now Genson is able to deserialize it back to Person using the information 
// in the Json Object
Person person = (Person) genson.deserialize(json, Entity.class);

另一个不错的功能是为您的类定义别名的能力,因此您在 json 流中显示的信息更少,但这也允许您进行重构而无需担心现有的 json 流(例如,如果您将其存储在数据库中)。

Genson genson = new Genson.Builder().addAlias("person", Person.class).create();
// json value is {"@class": "person"}
String json = genson.serialize(new Person());

看看维基

于 2012-10-02T15:23:34.087 回答