gpt4 book ai didi

Java Jackson 序列化器获取变量名称

转载 作者:行者123 更新时间:2023-12-01 10:07:33 25 4
gpt4 key购买 nike

我有一个像这样的类结构:

public class Foo {
private Foo2 title;
private Foo2 message;
}

public class Foo2 {
private String value;
private String variable;
}

当我将这些类序列化为 json 时,我想输出以下 json:

{
"type": "title",
"value": "...",
"variable": "..."
},
{
"type": "message",
"value": "...",
"variable": "..."
}

我制作了一个自定义序列化器类,如下所示:

public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(Foo value,
JsonGenerator gen,
SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("type", /* get variable name */);
gen.writeStringField("value", value.getValue());
gen.writeStringField("variable", value.getVariable());
gen.writeEndObject();
}
}

但我不知道如何获取变量名称。我以正确的方式处理这件事吗?如果是这样,我如何获取变量名称?

最佳答案

我实现了一个可能的解决方案,我认为它可以实现您正在寻找的目标,或者至少指出您自己的解决方案。

public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(Foo value,
JsonGenerator gen,
SerializerProvider serializers) throws IOException {

gen.writeStartObject();

Field[] fields = value.getClass().getDeclaredFields();

for (Field field : fields) {
field.setAccessible(true);
try {
Foo2 obj = (Foo2) field.get(value);
gen.writeFieldName(field.getName());
gen.writeStartObject();
gen.writeStringField("type", field.getName());
gen.writeStringField("value", obj.getValue());
gen.writeStringField("variable", obj.getVariable());
gen.writeEndObject();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
gen.writeEndObject();
}
}

测试用例:

public static void main(String[] args) throws JsonProcessingException {
Foo2 message = new Foo2("valueMessage", "variableMessage");
Foo2 title = new Foo2("valueTitle", "variableTitle");
Foo foo = new Foo(title, message);
ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule();
module.addSerializer(Foo.class, new FooSerializer());
mapper.registerModule(module);

String serialized = mapper.writeValueAsString(foo);
System.out.println(serialized);

}

输出 JSON:

  {
"message": {
"type": "message",
"value": "valueMessage",
"variable": "variableMessage"
},
"title": {
"type": "title",
"value": "valueTitle",
"variable": "variableTitle"
}
}

我找不到一种在不给节点命名的情况下编写嵌套对象的方法,也许你可以找到一种方法。无论如何,如果需要任何帮助来根据您的需求进行调整,请告诉我。

关于Java Jackson 序列化器获取变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36340655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com