强制杰克逊映射器总是在没有注释的writeValue上添加类类型

时间:2012-09-27 14:21:45

标签: json jackson

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

例如:

package org.acme;

class ClassA
{
    String a;
    String b;
}

我想生成的json是: [ “org.acme.ClassA”,{ “一个”: “STR1”, “B”: “STR2”}]

2 个答案:

答案 0 :(得分:5)

您可以使用ObjectMapper的enableDefaultTyping()

来实现

e.g。

mapper.enableDefaultTyping(DefaultTyping.OBJECT_AND_NON_CONCRETE);

请参阅ObjectMapper API

答案 1 :(得分:1)

如果您可以自由更换杰克逊并且不特别需要与您所展示的格式匹配的格式,则可以尝试使用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());

查看wiki