加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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"
}

编辑:
我希望通过这个目标实现的目标是具有长JSON格式,这种格式适用于调试(人类可读)并且具有提供最小占用空间的压缩格式.

解决方法

你可以通过很多方式做到这一点.这取决于您的要求.我建议你实现自己的属性命名策略.见下面的例子:

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
在@aumand评论之后我想通知,这个解决方案不适用于包含许多从同一个字母开头的属性的实体.我们必须编写更复杂的解决方案.例如:

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}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读