Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 Jackson:如何在不修改POJO的情况下编辑JSON的现有属性?_Java_Json_Jackson_Pojo - Fatal编程技术网

Java Jackson:如何在不修改POJO的情况下编辑JSON的现有属性?

Java Jackson:如何在不修改POJO的情况下编辑JSON的现有属性?,java,json,jackson,pojo,Java,Json,Jackson,Pojo,我需要在POJO中编辑“现有字段”的名称,而不是添加“额外字段”。是否可以使用下面的方法参考链接 请注意,我不想使用@JsonProperty注释 要求是,我有一个POJO,希望每次都使用不同的字段名,而不改变POJO。例如,我在POJO中有一个字段c_id,有时它需要写为cust_id,而另一次则是my_id 还要注意,我不能更改POJO的实现,因为它已经在几个模块中使用,并且具有通用实现 POJO示例: class MyPojo { String id; // getter

我需要在POJO中编辑“现有字段”的名称,而不是添加“额外字段”。是否可以使用下面的方法参考链接

请注意,我不想使用
@JsonProperty
注释

要求是,我有一个POJO,希望每次都使用不同的字段名,而不改变POJO。例如,我在POJO中有一个字段
c_id
,有时它需要写为
cust_id
,而另一次则是
my_id

还要注意,我不能更改POJO的实现,因为它已经在几个模块中使用,并且具有通用实现

POJO示例:

class MyPojo {
    String id; 
    // getter and setters
}
预期输出可以是以下内容:(字段名称可以更改)

  • {“客户id”:“123”}
  • {“我的id”:“123”}

  • 混合

    修改Jackson输出而不向原始POJO添加注释的最简单方法是使用mixin

    只需定义一个带有必要注释的mixin类,并向Jackson指示在序列化原始对象时要使用mixin

    private static class MyPojoMixin {
        @JsonProperty("cust_id")
        private String id;
    }
    
    public String serializeWithMixin(MyPojo p) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.addMixIn(MyPojo.class, MyPojoMixin.class);
    
        return mapper.writeValueAsString(p);
    }
    
    自定义属性命名策略

    如果需要以编程方式更改字段名,则可能无法使用mixin解决方案。然后,您可以使用自定义属性命名策略:

    public class IdRenamingStrategy extends PropertyNamingStrategy {
        private final PropertyNamingStrategy inner;
        private final String newIdPropertyName;
    
        public IdRenamingStrategy(String newIdPropertyName) {
            this(PropertyNamingStrategy.LOWER_CAMEL_CASE, newIdPropertyName);
        }
    
        public IdRenamingStrategy(PropertyNamingStrategy inner, String newIdPropertyName) {
            this.inner = inner;
            this.newIdPropertyName = newIdPropertyName;
        }
    
        private String translate(String propertyName) {
            if ("id".equals(propertyName)) {
                return newIdPropertyName;
            } else {
                return propertyName;
            }
        }
    
        @Override
        public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
            return inner.nameForField(config, field, translate(defaultName));
        }
    
        @Override
        public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
            return inner.nameForGetterMethod(config, method, translate(defaultName));
        }
    
        @Override
        public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
            return inner.nameForSetterMethod(config, method, translate(defaultName));
        }
    
        @Override
        public String nameForConstructorParameter(MapperConfig<?> config, AnnotatedParameter ctorParam, String defaultName) {
            return inner.nameForConstructorParameter(config, ctorParam, translate(defaultName));
        }
    }
    

    @Feku279:下面是一个如何使用Mixin的示例:请参阅和了解更多想法。这两个选项对我都适用。但是,第二个选项(自定义特性命名策略)适用于单个对象的一次一个字段。所以我选择了第一个(mixin),它满足了我的需求。谢谢
    public String serializeWithPropertyNamingStrategy(MyPojo p) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(new IdRenamingStrategy("cust_id"));
    
        return mapper.writeValueAsString(p));
    }