关于字段值的 Jackson Objectmapper?

Jackson Objectmapper on value of field?

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

例如:attribute ---> attr, name --> nm

OBJECT MAPPER:---> JSON STRING:
{
  "attribute" : [ {
    "name" : "accessPolicyIDs",
    "value" : "R400"
  }, {
    "name" : "maxOfInstances",
    "value" : "10"
  } ]
}

我可以通过以下方式实现这一点 class:

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 属性中的值也转换为短名称。前任: accessPolicyIDs --> 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
   }
}

要使用此序列化程序,请将其添加到映射器:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(new CustomValueSerializer());
mapper.registerModule(module);
String jsonString = mapper.writeValueAsString(person);

此外,如果您可以访问 pojo,则可以使用注释标记 Name 属性:

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