Java 编码/解码JSON密钥?

Java 编码/解码JSON密钥?,java,json,parsing,jackson,gson,Java,Json,Parsing,Jackson,Gson,我想通过缩小键来发送JSON的缩小版本 将我的POJO编组为JSON后获得的输入JSON字符串: { "stateTag" : 1, "contentSize" : 10, "content" : { "type" : "string", "value" : "Sid" } } 所需的JSON字符串,我希望通过网络发送该字符串以最小化负载: { "st" : 1, "cs"

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

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

   {
       "stateTag" : 1,
       "contentSize" : 10,
       "content" : {
          "type" : "string",
          "value" : "Sid"
       }
   }
所需的JSON字符串,我希望通过网络发送该字符串以最小化负载:

{
   "st" : 1,
   "cs" : 10,
   "ct" : {
      "ty" : "string",
      "val" : "Sid"
   }
 }
java中有没有标准的方法来实现这一点

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

编辑

我无法更改POJO以提供注释。我有XSD文件,从中生成java类。因此,无法更改任何内容。

使用注释。。。 对于gson: 在类成员上添加
@SerializedName(“st”)
会将变量stateTag序列化为
“st”:1
,无论在json中嵌套对象有多深。

使用注释。。。 对于gson:
在类成员上添加
@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));

您可以在Jackson中使用
@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));

我认为这将节省最小的带宽,通过在长密钥和短密钥客户端/服务器端之间建立映射,您可以从网络上卸载存储?为什么不使用apache deflate选项这里是一个示例,我认为这将节省最小的带宽,您可以通过在长密钥和短密钥客户端/服务器端之间建立映射来从网络上卸载存储。在客户端,用户必须解释您的“所需json”?为什么不使用apachedeflate选项?这里是一个例子,我无法更改我的pojo。我获取XSD文件,从中生成java类。因此,更改任何内容都不是一个选项您可以使用java类作为方法的参数吗?如果是这样,我将建议使用自定义序列化程序的另一种解决方案。我接收作为
对象发送的数据。例如:客户端:
HttpEntity entity=newbytearrayentity(jsonContent.getBytes(“UTF-8”);((HttpPost)httpUriRequest).setEntity(entity)
@POST@Consumes({“application/json”})@products({“application/json”})公共字符串handlePostRequest(对象资源){
所以你不知道你的pojo中是否会存在一个特定的属性?我有一个变量
resourcetype
,从中我决定哪个资源是来的,并使用切换案例来处理不同的资源。实际上有很多资源需要创建,所以我需要一个通用对象,否则我将不得不单独编写每个资源类型的e函数我不能更改我的POJO。我获取XSD文件,从中生成java类。因此,更改任何内容都不是一个选项您可以使用java类作为方法的参数吗?如果可以,我将建议使用自定义序列化器的另一种解决方案。我接收作为
对象
类型发送的数据。例如:客户端:
HttpEntity Entity=new ByteArrayEntity(jsonContent.getBytes(“UTF-8”);((HttpPost)httpUriRequest).setEntity(Entity);
在服务器上:
@POST@Consumes({“application/json”})@Products({“application/json”})公共字符串handlePostRequest(对象资源){
所以你不知道你的pojo中是否会存在一个特定的属性?我有一个变量
resourcetype
,从中我决定哪个资源是来的,并使用切换案例来处理不同的资源。实际上有很多资源需要创建,所以我需要一个通用对象,否则我将不得不单独编写每个资源类型的e函数我不能更改我的POJO。我获取XSD文件,从中生成java类。因此,更改任何内容都不是选项。我无法更改我的POJO。我获取XSD文件,从中生成java类。因此,更改任何内容都不是选项