1

我正在使用 JacksonObjectMapper转换为 JSON 字符串。我想使用 aPropertyNamingStrategy以便我的字段可以被赋予不同的名称。

前任:attribute ---> 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属性内部的值转换为短名称。前任: accessPolicyIDs --> acp, maxOfInstances --> mxi

这怎么能实现??可以ObjectMapper配置为处理特定字段的值吗?

4

1 回答 1

2

您可以尝试创建自定义 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;
}
于 2016-01-08T09:12:31.750 回答