Nutz.Json 注解一览表

优质
小牛编辑
129浏览
2023-12-01




















@JsonField
属性或方法
控制是否忽略该属性,控制输出及日期格式
@JsonIgnore
属性或方法
专门用于控制忽略特定数值
@ToJson
方法
自定义本对象转换为Json字符串的逻辑
@JsonShape
枚举类
用于控制枚举类型的转换格式

JsonField的ignore配置详解

忽略属性,无论是fromJson还是toJson,永久性的哦,即使JsonFormat也不可控制. 默认为false

public class Pet {
    private String name;
    private int age;
    
    @JsonField(ignore=true)
    private String location;
}

测试代码

Pet pet = new Pet();
pet.setName("dongdong");
pet.setAge(10);
pet.setLocation("地球");
Json.toJson(pet);

输出

{
    name : "dongdong",
    age : 10
}

JsonField的forceString配置

指定属性直接应用toJson,而不进行Map-List变换,默认为false

public class Pet {
    private String name;
    private int age;
    
    @JsonField(forceString=true)
    private Location location;
}

public class Location {
    private String planet;
    private String area;
    
    public Location(){}
    
    public Location(String planet, String area) {
        this.planet = planet;
        this.area = area;
    }
    
    public String toString() { 
        // 任何返回值就会直接拼入json字符串,不经转义.
        // 这里返回 "[1,PI]"
        // 那么拼入字符串中的值就是  [1, PI]
        return "[1, PI]";
        
    }
}

测试代码

Pet pet = new Pet();
pet.setName("dongdong");
pet.setAge(10);
pet.setLocation(new Location("地球", "北半球"));
Json.toJson(pet);

输出,注意PI并没有用双引号圈起来.

{
    name : "dongdong",
    age : 10,
    location : [1, PI]
}

JsonField的dateFormat配置

当属性类型为java.util.Date类或其子类时,这配置可以控制输出的日期格式

public class Pet {
    private String name;
    
    @JsonField(dateFormat="yyyyMMdd")
    private java.util.Date born;
}

测试代码

Pet pet = new Pet();
pet.setName("dongdong");
pet.setDate(new Date());
Json.toJson(pet);

输出

{
    name : "dongdong",
    born : "20150608"
}

JsonIgnore注解

当前,这个注解是专门用于忽略特定的数值

下面的配置,就是当age为100时不输出,当location为0.2d时也不输出

public class Pet {
    private String name;
    
    @JsonIgnore(null_int=100)
    private int age;
    
    @JsonIgnore(null_double=0.2d)
    private double location;
}

注意,切勿import错了哦,因为jackson里面也有个相同名称的注解

ToJson注解

这个注解可以让你完全控制当前类的json输出, 方法的返回值将直接拼入Json字符串,不经过任何转义.

被注解的方法有2种方式,无参或以JsonFormat作为参数,返回值必须是String

@ToJson
public String wendalJson() {
    return "age:" + age + ", /*我就喜欢弄个注释*/";
}
@ToJson
public String wendalJson(JsonFormat jf) {
    if (name == null && jf.isIgnoreNull) {
        return "{age:" + age + "}";
    }
    return "{age:" + age + ", name: null}"; // 我就喜欢返回个null,有值也返回null,咋的,就是这么任性
}

JsonShape注解

这个注解可以让你控制枚举类型的输出格式, 某些情况下对于复杂枚举对象我们需要输出枚举的属性字段就可以使用这个注解.

注解值为Type类型枚举,有ORDINAL, NAME, OBJECT

ORDINAL 输出枚举的有ORDINAL

NAME 输出枚举的NAME

OBJECT 对于简单枚举类说输出的是枚举的NAME,因为我们也不知道怎么把简单枚举转换成object造型;对于复杂枚举将输出枚举的详细属性

具体使用请参考一下测试用例

@JsonShape(Type.OBJECT)
public static enum TT {

    T("t", 1);
    String name;

    int index;

    /**
     * @param name
     * @param index
     */
    private TT(String name, int index) {
        this.name = name;
        this.index = index;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the index
     */
    public int getIndex() {
        return index;
    }

    /**
     * @param index
     *            the index to set
     */
    public void setIndex(int index) {
        this.index = index;
    }

}

@JsonShape
public static enum K {
    K, T
}

@Test
public void test_enum() {
    assertEquals(""K"", Json.toJson(K.K));
    String expected = "{n" + "   "name": "t",n" + "   "index": 1n" + "}";
    assertEquals(expected, Json.toJson(TT.T));
}

虚拟属性

虚拟属性指的是没有对应的属性,但有成对的getter/setter. 例如

public class PojoForQQ {
    public int id;
    @JsonField
    public String getName() {
        return "wendal," + id;
    }
    public void setName(String name) {
    }
}

会输出

{
    "id" : 123,
    "name" : "wendal,123"
}

可以看到, 成对的getter/setter,配合@JsonField,可以输出一个虚拟属性.