Java 任何对象的自定义JSON序列化包装器
我使用外部应用程序,它需要一个可以从我这里序列化的对象,比如他的函数:Java 任何对象的自定义JSON序列化包装器,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我使用外部应用程序,它需要一个可以从我这里序列化的对象,比如他的函数: externalFunction(Object input); 因此,我应该为该函数提供一个输入,当调用该方法时(不是由我控制),该输入将被正确序列化为JSON 但我不知道数据是如何构造的,因为我动态地从另一个外部应用程序接收输入。这样的情况: { ... some fields/values that I don't know, get from 3rd party } 1.从第三方获取数据 2.MyApp应该为J
externalFunction(Object input);
因此,我应该为该函数提供一个输入,当调用该方法时(不是由我控制),该输入将被正确序列化为JSON
但我不知道数据是如何构造的,因为我动态地从另一个外部应用程序接收输入。这样的情况:
{
... some fields/values that I don't know, get from 3rd party
}
1.从第三方获取数据
2.MyApp应该为Json序列化的数据添加注释
3.将数据作为输入发送给第三方
4.响应将作为JSON生成
我怎样才能做到这一点?调用函数时,如何为已正确序列化的函数提供输入
到目前为止,我尝试的是:
因此,我首先尝试使用一些包装器包装数据,如:
public class JsonWrapper<T> implements Serializable
{
public T attributes;
public JsonWrapper( T attributes )
{
this.attributes = attributes;
}
@JsonValue
public T getAttributes( )
{
return attributes;
}
}
我想要这样:
{
... some fields/values that I don't know, get from 3rd party
}
当t
是集合
时,注释不起作用(请参见Jackson的创建者提供的)。但注释实际上起到了作用:
公共类JsonWrapper{
@JsonValue
私人T值;
公共JsonWrapper(T值){
这个值=值;
}
公共T getValue(){
返回值;
}
}
如果使用,您可以:
@Getter
@AllArgsConstructor
公共类JsonWrapper{
@JsonValue
私人T值;
}
例子 考虑以下类别:
@数据
@AllArgsConstructor
公共阶层人士{
私有字符串名;
私有字符串lastName;
}
序列化Person
实例时,会生成以下结果:
ObjectMapper mapper=new ObjectMapper();
JsonWrapper=newJSONWrapper(新人(“约翰”、“多伊”));
字符串json=mapper.writeValueAsString(包装器);
序列化Person
实例列表时,会生成以下结果:
ObjectMapper mapper=new ObjectMapper();
JsonWrapper=新的JsonWrapper(
Arrays.asList(
新人(“约翰”、“Doe”),
新人(“简”、“坡”)
));
字符串json=mapper.writeValueAsString(包装器);
我相信您提到的预期输出不是有效的JSON语法。内部块必须有一个标识符键,不是吗?我的错误是更新为什么要包装从
getFromThirdParty()
方法收到的data
对象。只需传递数据
对象。因为当我将数据对象传递给另一个第三方库时,所有属性都被正确解析,该库有自己的属性,但没有我的对象。我的数据对象只是显示为它的toString方法,而不是正确的json。谢谢你的回答。我无法创建Person实例等,因为我不知道我将从第三方收到哪些属性。所以在我的例子中,我将有一些对象,我需要像新的JsonWrapper(objectReceived)一样包装它。正如我所描述的,我使用了@JsonValue,但您在字段上使用了它,我认为它们是相同的。我也试过了,它在我的JsonWrapper类中再次返回字段“attributes”。@cmlonderPerson
只是一个例子。它可能是任何东西。重要的部分是带有@JsonValue
的JsonWrapper
。你用的是哪个版本的杰克逊?更重要的是,你在这里是如何使用Jackson的?我没有处理Jackson的互动。我使用的库要求我向它们返回一些可序列化的对象。当我不添加任何Jackson注释时,库自动使用我放置的对象的toString方法。因此,我认为我可以通过使用JsonValue或类似的注释,以某种方式使返回值适合json。当我调试时,我看到当我重写toString方法并对其使用JsonValue时,或者当我对getAttributes使用注释时,会触发调试点method@cmlonder“我使用的库期望我…”那么你使用的是哪个库?CAS,我不想在这里提及它,因为它可能会变得更复杂,因为在实现JSON或库本身时,任何一个问题都是因为我而发生的。我也在另一个线程中检查它:
{
... some fields/values that I don't know, get from 3rd party
}
{"firstName":"John","lastName":"Doe"}
[{"firstName":"John","lastName":"Doe"},{"firstName":"Jane","lastName":"Poe"}]