Encode/decode JSON 键?
Encode/decode JSON keys?
我想通过缩小 键 来发送我的 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 类。所以改变任何东西都没有选择。
使用注释...
与格森:
在 Class 成员上添加 @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));
解决方案 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));
我想通过缩小 键 来发送我的 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 类。所以改变任何东西都没有选择。
使用注释...
与格森:
在 Class 成员上添加 @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));
解决方案 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));