首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码/解码JSON密钥?

编码/解码JSON密钥?
EN

Stack Overflow用户
提问于 2015-12-02 07:12:39
回答 2查看 683关注 0票数 0

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

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

代码语言:javascript
复制
   {
       "stateTag" : 1,
       "contentSize" : 10,
       "content" : {
          "type" : "string",
          "value" : "Sid"
       }
   }

所需的JSON字符串,我想通过网络发送,以最小化有效负载:

代码语言:javascript
复制
{
   "st" : 1,
   "cs" : 10,
   "ct" : {
      "ty" : "string",
      "val" : "Sid"
   }
 }

在java中有什么标准的方法来实现这一点吗??

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

编辑

我不能更改POJO来提供注释。我有XSD文件,可以从中生成我的java类。所以改变任何事情都是没有选择的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-02 07:52:25

您可以通过使用@JsonProperty注释在Jackson中实现这一点。

代码语言:javascript
复制
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));

    }

产出:

代码语言:javascript
复制
{
  "st" : 1,
  "cs" : 10,
  "ct" : {
    "ty" : "string",
    "val" : "sid"
  }
}

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

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

代码语言:javascript
复制
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(使用命名策略):该解决方案是一个通用解决方案。

代码语言:javascript
复制
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));
票数 2
EN

Stack Overflow用户

发布于 2015-12-02 07:16:42

使用注释..。使用gson:在Class成员上添加@SerializedName("st")将变量stateTag序列化为"st" : 1,不管您要在json中嵌套多深的对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34036861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档