当前位置: 首页 > 面试题库 >

Jackson动态属性名称

刘和昶
2023-03-14
问题内容

我想序列化一个对象,以便根据字段的类型对字段之一进行不同的命名。例如:

public class Response {
    private Status status;
    private String error;
    private Object data;
        [ getters, setters ]
    }

在这里,我希望将该字段data序列化为类似的内容,data.getClass.getName()而不是总是data根据情况将字段称为包含不同类型的字段。

使用Jackson怎么能达到这样的目的?


问题答案:

使用自定义JsonSerializer

public class Response {
  private String status;
  private String error;

  @JsonProperty("p")
  @JsonSerialize(using = CustomSerializer.class)
  private Object data;

  // ...
}

public class CustomSerializer extends JsonSerializer<Object> {
  public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    jgen.writeStartObject();
    jgen.writeObjectField(value.getClass().getName(), value);
    jgen.writeEndObject();
  }
}

然后,假设您要序列化以下两个对象:

public static void main(String... args) throws Exception {
  ObjectMapper mapper = new ObjectMapper();
  Response r1 = new Response("Error", "Some error", 20);
  System.out.println(mapper.writeValueAsString(r1));
  Response r2 = new Response("Error", "Some error", "some string");
  System.out.println(mapper.writeValueAsString(r2));
}

第一个将打印:

{"status":"Error","error":"Some error","p":{"java.lang.Integer":20}}

第二个:

{"status":"Error","error":"Some error","p":{"java.lang.String":"some string"}}

我使用了p包装对象的名称,因为它仅用作p花边固定器。如果要删除它,则必须为 整个
类编写一个自定义序列化程序,即JsonSerializer<Response>



 类似资料:
  • 我有以下课程- 我如何通过使用Jackson JSON API动态地排除字段序列化?

  • 问题内容: 我想序列化一个对象,以便根据字段的类型对字段之一进行不同的命名。例如: 在这里,我希望将字段序列化为类似的内容,而不是总是根据情况包含一个称为不同类型的字段。 使用Jackson怎么能达到这样的目的? 问题答案: 使用自定义。 然后,假设您要序列化以下两个对象: 第一个将打印: 第二个: 我使用了包装对象的名称,因为它仅用作花边固定器。如果要删除它,则必须为 整个 类编写一个自定义序列

  • 问题内容: 有没有一种方法可以在序列化期间更改Data属性的名称,因此我可以在WEB Api中重用该类。 例如,如果我要返回用户的分页列表,则应将Data属性序列化为“用户”,如果要返回项目列表,则应将其称为“项目”,依此类推。 可能是这样的: 编辑: 我希望对此功能进行控制,例如,尽可能传递名称。如果我叫,我还是想序列化的属性被称为,没有。 例 问题答案: 您可以通过自定义进行操作。解析器可以寻

  • 问题内容: 我如何做到这一点: 问题答案: 请改用方括号表示法。 或者,在现代JavaScript中:

  • 本文向大家介绍JavaScript 动态/可变属性名称,包括了JavaScript 动态/可变属性名称的使用技巧和注意事项,需要的朋友参考一下 示例 有时,属性名称需要存储到变量中。在此示例中,我们询问用户需要查找哪个词,然后提供来自我命名的对象的结果dictionary。 注意我们如何使用[]括号表示法来查看名为word;的变量。如果我们使用传统的.表示法,那么它将按字面值取值,因此: 您也可以

  • 问题内容: 我使用不同的数据库,并且根据数据库,我需要将“ id”命名为不同的名称。因此,例如在id中被命名为“ @rid” 对于MongoDB,该ID名为“ _id” 我不知道现代数据库开发人员有什么问题,不仅仅是命名id字段“ id” ^^。但是现在我有一个问题。在某些情况下,如何将ID字段动态序列化/反序列化为“ @rid”,在另一种情况下,如何动态序列化/反序列化为“ _id”? 编辑: