2015-12-02 125 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文件。所以改變任何東西都不是一種選擇 –