Encode/decode JSON 键?

Encode/decode JSON keys?

我想通过缩小 来发送我的 JSON 的缩小版本。

将我的 POJO 编组为 JSON 后获得的 输入 JSON 字符串:

   {
       "stateTag" : 1,
       "contentSize" : 10,
       "content" : {
          "type" : "string",
          "value" : "Sid"
       }
   }

我想要通过网络发送的 JSON STRING 以最小化负载:

{
   "st" : 1,
   "cs" : 10,
   "ct" : {
      "ty" : "string",
      "val" : "Sid"
   }
 }

在 java 中是否有任何标准方法可以实现此目标??

PS:我的 json 字符串可以与其他对象嵌套,我也必须将其缩小。

编辑:

我无法更改我的 POJO 以提供注释。我有 XSD 个文件,我从中生成 java 类。所以改变任何东西都没有选择。

使用注释... 与格森: 在 Class 成员上添加 @SerializedName("st") 会将变量 stateTag 序列化为 "st" : 1,无论您要嵌套对象的 json 有多深。

您可以使用 @JsonProperty 注释在 Jackson 中实现此目的。

public class Pojo {

    @JsonProperty(value = "st")
    private long stateTag;
    @JsonProperty(value = "cs")
    private long contentSize;
    @JsonProperty(value = "ct")
    private Content content;

    //getters setters
}

public class Content {

    @JsonProperty(value = "ty")
    private String type;
    @JsonProperty(value = "val")
    private String value;

}

public class App {

    public static void main(String... args) throws JsonProcessingException, IOException {

        ObjectMapper om = new ObjectMapper();

        Pojo myPojo = new Pojo(1, 10, new Content("string", "sid"));

        System.out.print(om.writerWithDefaultPrettyPrinter().writeValueAsString(myPojo));

    }

输出:

{
  "st" : 1,
  "cs" : 10,
  "ct" : {
    "ty" : "string",
    "val" : "sid"
  }
}

解决方案 2(使用自定义序列化程序):

此解决方案特定于您的 pojo,这意味着对于每个 pojo,您都需要一个新的序列化程序。

public class PojoSerializer extends JsonSerializer<Pojo> {

    @Override
    public void serialize(Pojo pojo, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        /* your pojo */
        jgen.writeStartObject();
        jgen.writeNumberField("st", pojo.getStateTag());
        jgen.writeNumberField("cs", pojo.getContentSize());

        /* inner object */
        jgen.writeStartObject();
        jgen.writeStringField("ty", pojo.getContent().getType());
        jgen.writeStringField("val", pojo.getContent().getValue());
        jgen.writeEndObject();

        jgen.writeEndObject();
    }

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

}



ObjectMapper om = new ObjectMapper();

Pojo myPojo = new Pojo(1, 10, new Content("string", "sid"));

SimpleModule sm = new SimpleModule();
sm.addSerializer(new PojoSerializer());
System.out.print(om.registerModule(sm).writerWithDefaultPrettyPrinter().writeValueAsString(myPojo));

解决方案 3(使用命名策略): 此方案为通用方案。

public class CustomNamingStrategy extends PropertyNamingStrategyBase {

    @Override
    public String translate(String propertyName) {

        // find a naming strategy here

        return propertyName;
    }

}

ObjectMapper om = new ObjectMapper();
Pojo myPojo = new Pojo(1, 10, new Content("string", "sid"));

om.setPropertyNamingStrategy(new CustomNamingStrategy());

  System.out.print(om.writerWithDefaultPrettyPrinter().writeValueAsString(myPojo));