Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 任何对象的自定义JSON序列化包装器_Java_Json_Serialization_Jackson - Fatal编程技术网

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”。@cmlonder
Person
只是一个例子。它可能是任何东西。重要的部分是带有
@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"}]