2015-12-02 4 views
0

Я хочу отправить сокращенную версию моего JSON, минируя ключи.Кодировать/расшифровывать ключи JSON?

ввода JSON строку, полученный после сортировочного мой POJO в формате JSON:

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

Желаемая JSON STRING, который я хочу отправить по сети для минимизации полезной нагрузки:

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

ли там какой-то стандартный способ в java для достижения этого?

PS: Моя строка json может быть вложена другими объектами, которые тоже мне придется минимизировать.

EDIT:

Я не могу изменить мой POJO, чтобы обеспечить аннотации. У меня есть файлы XSD, из которых я генерирую свои классы java. Поэтому менять что-либо там не вариант.

+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 (Использование пользовательских Serializer):

Это решение является специфическим для вашего 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. Я получаю файлы XSD, из которых я генерирую свои классы java. Таким образом, изменение чего-либо не является опцией. –

+0

Можете ли вы использовать свои классы java в качестве параметра для методов? Если это так, я предлагаю другое решение с использованием настраиваемого сериализатора. – Ghokun

+0

Получаю данные, отправленные как 'Object'. Пример: ** Клиент **: 'Объект HttpEntity = новый 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. Я получаю файлы XSD, из которых я генерирую свои классы java. Поэтому изменить что-либо не вариант –

Смежные вопросы