Jackson Objectmapper关于领域的价值?

时间:2016-01-08 04:47:00

标签: java json jackson objectmapper

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

例如: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配置为处理特定字段的值吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试创建自定义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
   }
}

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

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;
}