java – 获取同一对象的不同JSON表示
发布时间:2020-12-15 05:02:40 所属栏目:Java 来源:网络整理
导读:给定一个与Jackson一起序列化为 JSON字符串的java对象. 是否可以控制序列化过程从同一对象生成不同的JSON输出? 压缩: { "a":"123","s":"100"} 或正常: { "altitude":"123","speed":"100"} 编辑: 我希望通过这个目标实现的目标是具有长JSON格式,这种格式
给定一个与Jackson一起序列化为
JSON字符串的java对象.
是否可以控制序列化过程从同一对象生成不同的JSON输出? 压缩: { "a":"123","s":"100" } 或正常: { "altitude":"123","speed":"100" } 编辑: 解决方法
你可以通过很多方式做到这一点.这取决于您的要求.我建议你实现自己的属性命名策略.见下面的例子:
class CompressedPropertyNamingStrategy extends PropertyNamingStrategyBase { private static final long serialVersionUID = 1L; @Override public String translate(String name) { return String.valueOf(name.charAt(0)); } } 您可以这样使用它: ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(new CompressedPropertyNamingStrategy()); String json = mapper.writeValueAsString(new Pojo()); 如果您不想压缩属性名称,只需删除第2行. 编辑1 class CompressedPropertyNamingStrategy extends PropertyNamingStrategyBase { private static final long serialVersionUID = 1L; private final int length; public CompressedPropertyNamingStrategy(int length) { this.length = length; } @Override public String translate(String name) { if (name.length() < length) { return name; } return name.substring(0,length); } } 编辑2 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value = { ElementType.METHOD,ElementType.FIELD }) @Retention(value = RetentionPolicy.RUNTIME) public @interface CompressedName { String value(); } 在这种情况下,您的命名策略可能如下所示: class CompressedPropertyNamingStrategy extends PropertyNamingStrategy { private static final long serialVersionUID = 1L; @Override public String nameForGetterMethod(MapperConfig<?> config,AnnotatedMethod method,String defaultName) { CompressedName compressedProperty = method.getAnnotation(CompressedName.class); if (compressedProperty != null) { return compressedProperty.value(); } // Implement default value: first letter,or something else return defaultName; } } 现在,您必须为实体方法添加注释: class Entity { private long altitude = 123; private int speed = 100; @CompressedName("a") public long getAltitude() { return altitude; } public void setAltitude(long altitude) { this.altitude = altitude; } @CompressedName("sp") public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } } 在此方案示例中,JSON可能如下所示: {"a":123,"sp":100} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |