jackson json 关于序列化与反序列化时json中字段名称的问题

IncRediblE 发布于 2014/07/24 15:52
阅读 24K+
收藏 1

Json如下

{

    "student_id": 1

}

model如下:

class Student {
    @JsonProperty("student_id")
    private int studentId;

    public Student() {}
    public int getStudentId() {
        return studentId;
    }
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
}
这时候使用jackson是可以将json转为此model,

问题是,我再把这个model转成json时,我想变成

{

    "studentId": 1

}

该怎么办


===============================================

参考stackoverflow

class Student {
    
    private int studentId;

    public Student() {}
    @JsonIgnore
    public int getStudentId() {
        return studentId;
    }
    @JsonProperty("student_id")
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
    @JsonProperty("studentId")
    public int getJavaStudentId() {
        return studentId;
    }
}



大概就是类字段或该字段所在的get和set其中一个被@JsonProperty标注了,序列化反序列化都统一了。

当再写一个get方法时,若被@JsonProperty标注了,反序列化时,就会多出这个字段。

所以正宗的get上要加个@JsonIgnore。

    没有看源码。。。就这样猜的


加载中
0
翠翠
翠翠

参考:http://stackoverflow.com/questions/8560348/different-names-of-json-property-during-serialization-and-deserialization

class Student {
    @JsonIgnore
    private int studentId;
 
    public Student() {}

    @JsonProperty("studentId")
    public int getStudentId() {
        return studentId;
    }

    @JsonProperty("student_id")
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
}



大概是这样,我没试过,你自己参考吧。

刘付kin
刘付kin
回复 @IncRediblE : 2.1.1版本不行,需要2.8.1
翠翠
翠翠
回复 @IncRediblE : 贴出来你最终的做法给大家参考下吧。
IncRediblE
IncRediblE
回复 @翠翠 : 按照原帖子成功了,你贴的跟原帖有差异
翠翠
翠翠
回复 @IncRediblE : 只做参考,stackoverflow上那人说成功了。
IncRediblE
IncRediblE
回复 @IncRediblE : 稍等,我少看到你字段上的@JsonIgore
下一页
0
荒野无灯
荒野无灯
private是不行的。public 试试。
刘付kin
刘付kin
只要get和set的方法是public即可,一般bean中的属性都设置为private,只能够通过get和set对他进行操作,这样提高安全性
刘付kin
刘付kin
private也是可以的
0
烽焱10仴
烽焱10仴
请楼主查看alibaba 的 fastjson (一个java类库)中 的 注解 @JSONField的使用。
0
苗哥
苗哥
试试 Google 的 Json 转换工具 Gson,可以将 JSON 和 Java 对象相互转化,使用方法非常简单。
0
kimmking
kimmking

Jackson的作者估计也没想到你这个使用场景。JsonProperty注解的信息,没办法处理了。

再加一个StudentBO,或者用另外一种不能识别jackson定义的@JsonProperty注解的库。


0
盛夏的白菜土豆西红柿
盛夏的白菜土豆西红柿
objectMapper.writeValue(System.out, model);这样行吗?
IncRediblE
IncRediblE
额,不是这个意思 ,我这个其实是拉取别人资源->转成自己model->输出自己json,其中自己json字段是与原json字段名称有差异的,就是这么个过程,不是单独转化model变成json
0
刘付kin
刘付kin

反序列化时,也就是json ==> java bean的时候,这样创建Mapper,默认是开启注解的

ObjectMapper jackMapper = new ObjectMapper();

在序列化,也就是bean ==> jsonStr的时候,设置忽略注解即可

jackMapper.configure(MapperFeature.USE_ANNOTATIONS, false);

例子:

public class JackjsonTest {
    public static void main(String[] args) {
        String jsonStr = "{\"firstName\":\"laowang\"}";
        //默认开启注解模式,也就是下面UserBean中的@JsonProperty("firstName")是起效果的
        ObjectMapper mapper = new ObjectMapper();
        try {
            //成功的将json 转化为了 userBean
            UserBean userBean = mapper.readValue(jsonStr, UserBean.class);

            //忽略注解,使得原来业务中的字段不变,也就还是:{first_name:laowang},如果不设置,则返回{firstName:laowang}
            mapper.configure(MapperFeature.USE_ANNOTATIONS, false);
            System.out.println(mapper.writeValueAsString(userBean));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

public class UserBean{
    @JsonProperty("firstName")
    private String first_name;

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }
}
IncRediblE
IncRediblE
哈哈,今天邮件收到了这么老问题的答复也是惊讶呀,😄
0
樊得涛

这里有json数组的字断映射脚本 供参考 http://www.icafebolger.com/javascript/nodekey.html

返回顶部
顶部