gpt4 book ai didi

java - 编码/解码 JSON key ?

转载 作者:行者123 更新时间:2023-12-01 18:09:26 24 4
gpt4 key购买 nike

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

将 POJO 编码为 JSON 后获得的输入 JSON 字符串:

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

所需的 JSON STRING 我想通过网络发送以最小化负载:

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

java中有没有标准的方法来实现这个?

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

编辑:

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

最佳答案

您可以在 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));

解决方案 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));

关于java - 编码/解码 JSON key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34036861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com