Java 字段值上的Jackson Objectmapper?

Java 字段值上的Jackson Objectmapper?,java,json,jackson,objectmapper,Java,Json,Jackson,Objectmapper,我正在使用JacksonObjectMapper转换为JSON字符串。我想使用PropertyNamingStrategy,以便可以为我的字段指定不同的名称 例如:属性-->attr,name-->nm OBJECT MAPPER:---> JSON STRING: { "attribute" : [ { "name" : "accessPolicyIDs", "value" : "R400" }, { "name" : "maxOfInstances",

我正在使用Jackson
ObjectMapper
转换为JSON字符串。我想使用
PropertyNamingStrategy
,以便可以为我的字段指定不同的名称

例如:
属性-->attr,name-->nm

OBJECT MAPPER:---> JSON STRING:
{
  "attribute" : [ {
    "name" : "accessPolicyIDs",
    "value" : "R400"
  }, {
    "name" : "maxOfInstances",
    "value" : "10"
  } ]
}
我可以通过以下课程来实现这一点:

public class LongNameShortNameNamingStrategy extends PropertyNamingStrategyBase {

    @Override
    public String translate(String propertyName) {

        String shortName = null;
        shortName = LongNameShortNames.getShortName(propertyName);
        if (shortName != null){
            return shortName;
        }

        return propertyName;
    }
}
但是,现在需要将
name
属性中的值也转换为短名称。前任:
accessPolicyId-->acp,maxOfInstances-->mxi

如何才能做到这一点??
是否可以将
ObjectMapper
配置为处理特定字段的值???

您可以尝试创建自定义ValueSerializer。 比如:

public class CustomValueSerializer extends JsonSerializer<String> {

   @Override
   public void serialize(String s, JsonGenerator jsonGenerator,
                         SerializerProvider serializerProvider) throws IOException {    

       if(jsonGenerator.getOutputContext().getCurrentName().equals("name")){
          s = getShortName(s);
       }
       jsonGenerator.writeString(s);
   }

   @Override
   public Class<String> handledType() {
       return String.class;
   }

   private String getShortName(String s){
      //make string short
   }
}
此外,如果您有权访问pojo,则可以使用注释标记
Name
属性:

@JsonProperty
@JsonSerialize(using = CustomValueSerializer.class)
public String getName(){
  return name;
}

为什么不使用@JsonProperty()更改字段名?我的POJO无法编辑。因此使用了
NamingStrategy
。我需要更改
name
字段的值。这是一个奇怪的要求,我认为如果不能修改对象类,可以使用自定义序列化器/反序列化器来实现。
@JsonProperty
@JsonSerialize(using = CustomValueSerializer.class)
public String getName(){
  return name;
}