当前位置: 首页 > 知识库问答 >
问题:

如何在自定义json序列化程序中获取属性或字段名称

扶文光
2023-03-14

我有一个字段的自定义JsonSerializer(简化代码):

@JsonSerialize(using=Text1Serializer.class)
@JsonProperty("text1") // I need this inside the custom serializer
@Override
public String getTextOne() {
    return "foo";
}

// ...

public static class Text1Serializerextends JsonSerializer<String> {

    @Override
    public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        // how to get "text1" here?
        provider.defaultSerializeValue(value, jgen);
    }

}

由于我需要用类似的逻辑序列化大约十个其他字段,这取决于字段名,如果我可以在自定义序列化程序中获得属性名,而不是编写十个相同的序列化程序,这将对我有很大帮助。

我已经看到,在serialize()方法中,我可以使用JsonGenerator获取整个对象。getCurrentValue()(参见此答案),但我没有找到获取字段名的方法。

我用的是Jackson 2.6

共有3个答案

薛承志
2023-03-14

可以通过调用jgen获取当前属性名称。getOutputContext()。getCurrentName()

萧光华
2023-03-14

如果您实现ContextualSerializer,这将用于生成序列化器的“上下文”版本,即使用BeanProperty配置的版本:

public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
    throws JsonMappingException;

这应该返回一个为给定属性自定义的新实例:它不必与非自定义序列化程序是同一个类(尽管标准Jackson实现似乎都是这样工作的)。

陈项禹
2023-03-14

您可以在自定义json序列化程序中获取字段名,如下所示:

@JsonComponent
public class Text1Serializerextends extends JsonSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        // will output "text1"
        System.out.println(jgen.getOutputContext().getCurrentName());

        provider.defaultSerializeValue(value, jgen);
    }
}
 类似资料:
  • 问题内容: 我有一个对象,该对象正在使用ServiceStack.Text命名空间中的方法进行反序列化。 如何在序列化过程中忽略所有唯一属性?有没有类似属性或可以用来装饰属性的东西,可以将其省略? 谢谢 问题答案: ServiceStack的文本序列化程序遵循.NET的DataContract序列化程序行为,这意味着您可以使用opt- out 属性忽略数据成员 选择加入的方法是装饰要序列化的每个属

  • 我有以下ORM对象(简化): 每行有: 主键 插入行时的时间戳 computed_values要存储的实际JSONB数据 JSONB来存储计算数据的日期列表。 虽然我对列没有问题,但是对象不能被SQLAlchemy JSON序列化程序序列化。 我的想法是为该列重新定义对象的序列化程序行为。要做到这一点,我必须定义自己的自定义JSON序列化程序,或者使用一些现成的序列化程序,比如orjson。因为我

  • 更新发现了问题——从错误的类继承,需要是JsonConverter。 我有一个类型为System的Location属性的类。数据实体空间的地理。默认的Json。NET serializer输出JSON文本,如下所示: 我想让它发出这样的文本: ...所以在我看来,我应该做的是重写当前在DbGeography类型上使用的任何转换器。 到目前为止,我看到的使用CustomCreationConvert

  • 有没有一种方法可以使用Jackson JSON处理器来执行自定义字段级别的序列化?例如,我想让 注意,age=25被编码为数字,而favoritenumber=123被编码为字符串。Jackson将编组为一个数字。在这种情况下,我希望将favoriteNumber编码为字符串。

  • 有没有一种方法可以指定不同的序列化/反序列化JSON字段名,而不必显式地写出getter和setter方法,或许可以使用lombok getter和setter? 与此示例类似,下面的代码允许将传入的JSON反序列化为不同的POJO字段名。它还会使POJO字段名序列化为: 但这当然是不成立的。

  • 我正在序列化 和 与 添加了和以便能够序列化具有复杂键类型的映射。转换器是 我用的是杰克逊2.9.4。