首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >序列化和反序列化过程中JSON属性的不同名称

序列化和反序列化过程中JSON属性的不同名称
EN

Stack Overflow用户
提问于 2011-12-19 19:01:50
回答 12查看 239.4K关注 0票数 185

有没有可能:在Jackson库中序列化/反序列化时,类中有一个字段,但它有不同的名称?

例如,我有"Coordiantes“类。

代码语言:javascript
复制
class Coordinates{
  int red;
}

为了从JSON反序列化,我希望格式是这样的:

代码语言:javascript
复制
{
  "red":12
}

但是当我序列化对象时,结果应该是这样的:

代码语言:javascript
复制
{
  "r":12
}

我试图通过在getter和setter (具有不同的值)上应用@JsonProperty注释来实现这一点:

代码语言:javascript
复制
class Coordiantes{
    int red;

    @JsonProperty("r")
    public byte getRed() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}

但我有个例外:

红色org.codehaus.jackson.map.exc.UnrecognizedPropertyException:无法识别字段“

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-12-19 19:26:51

刚刚测试过了,这是可行的:

代码语言:javascript
复制
public class Coordinates {
    byte red;

    @JsonProperty("r")
    public byte getR() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}

这个想法是方法名称应该是不同的,所以jackson将其解析为不同的字段,而不是一个字段。

下面是测试代码:

代码语言:javascript
复制
Coordinates c = new Coordinates();
c.setRed((byte) 5);

ObjectMapper mapper = new ObjectMapper();
System.out.println("Serialization: " + mapper.writeValueAsString(c));

Coordinates r = mapper.readValue("{\"red\":25}",Coordinates.class);
System.out.println("Deserialization: " + r.getR());

结果:

代码语言:javascript
复制
Serialization: {"r":5}
Deserialization: 25
票数 230
EN

Stack Overflow用户

发布于 2017-08-10 00:40:38

你可以使用在jackson 2.9.0中引入的@jsonAlias

示例:

代码语言:javascript
复制
public class Info {
  @JsonAlias({ "red" })
  public String r;
}

这在序列化期间使用r,但在反序列化期间允许red作为别名。不过,这仍然允许对r进行反序列化。

票数 61
EN

Stack Overflow用户

发布于 2018-02-28 01:45:08

您可以结合使用@JsonSetter@JsonGetter来分别控制属性的反序列化和序列化。这还允许您保留与实际字段名相对应的标准化getter和setter方法名称。

代码语言:javascript
复制
import com.fasterxml.jackson.annotation.JsonSetter;    
import com.fasterxml.jackson.annotation.JsonGetter;

class Coordinates {
    private int red;

    //# Used during serialization
    @JsonGetter("r")
    public int getRed() {
        return red;
    }

    //# Used during deserialization
    @JsonSetter("red")
    public void setRed(int red) {
        this.red = red;
    }
}
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8560348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档