2015-12-02 152 views
0

我想通过缩小来发送缩小版本的JSON。编码/解码JSON密钥?

输入JSON字符串编组我的POJO以JSON后获得

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

所需的JSON字符串我想通过网络发送,以尽量减少有效载荷:

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

是有什么标准的方式在Java中实现这一点?

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

编辑

我不能改变我的POJO提供注解。我有我从中生成我的Java类的XSD文件。所以改变任何事情都没有选择。

+0

我认为这将节省带宽是最小的,则可以通过将具有长键和短键的客户端/服务器端之间的映射卸载从网络存储。 –

+0

在客户端用户将不得不解释您所需的json?为什么不使用Apache deflate选项http://stackoverflow.com/questions/19254859/does-apache-2-gzip-json-output-by-default – gurvinder372

+0

这是一个例子http://thegeekyland.blogspot.com/2015/ 11/serializing-and-deserializing-json-from.html – Arlind

回答

2

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

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)); 
+0

我无法改变我的POJO。我从中生成我的Java类的XSD文件。所以改变任何东西都不是一种选择 –

+0

你可以使用你的java类作为方法的参数吗?如果是这样我会建议使用自定义序列化器的另一个解决方案 – Ghokun

+0

我收到以“Object”类型发送的数据。例如:** Client **:'HttpEntity entity = new ByteArrayEntity(jsonContent.getBytes(“UTF-8”)); \t \t \t \t((HttpPost)httpUriRequest)。setEntity(实体);'论**服务器**:'@POST \t @Consumes({ “应用/ JSON”}) \t @Produces({ “应用/ JSON”}) \t公共字符串handlePostRequest(对象资源){' –

2

使用注解: 与GSON: 添加@SerializedName("st")在类成员将序列变量stateTag为"st" : 1,它不事关你有多深JSON去鸟巢的对象。

+0

我无法改变我的POJO。我从中生成我的Java类的XSD文件。所以改变任何东西都不是一种选择 –