首先这个注解有个参数可以设置,具体是:ordinal,name,format,serialize,deserialize。等等,后面的不常用啊。

先看model类。

package com.lxk.model;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * 鸟
 *
 * @author LiXuekai on 2018/10/25
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bird {
    //@JSONField(ordinal = 6, name = "内容是json字符串的属性", jsonDirect = true)
    //private String dog1;

    //@JSONField(ordinal = 5, name = "内容是json字符串的属性,对比下差异")
    //private String dog2;

    /**
     * ordinal,默认值为0,不用设置啦。
     */
    @JSONField(ordinal = 4, name = "生产日期", format = "yyyy年MM月dd日 HH时mm分ss秒")
    private Date birthday;

    @JSONField(ordinal = 3, name = "颜色")
    private String color;

    @JSONField(ordinal = 2, name = "体型大小")
    private String size;

    @JSONField(ordinal = 1, name = "年龄")
    private int age;
    /**
     * 反序列化false,那么在反序列化的时候,就不会把json的值转给对象的这个属性。
     */
    @JSONField(name = "名称", deserialize = false)
    private String name;
    /**
     * 不序列化此属性字段,那么在转json的时候,就不会在json中出现
     */
    @JSONField(ordinal = 7, name = "不序列化的属性字段", serialize = false)
    private String deserialize;


}

model类,使用了这个注解,然后,main方法调用。看看各个注解的作用。

/**
     * 测试 fast json 中的JsonField注解的使用
     */
    private static void testJsonField() {
        String dog = JsonUtils.parseObjToJson(new Dog("大师兄的dog", true, true));
        Bird bird = new Bird(new Date(), "红色皮肤", "巨大无比", 18, "典韦", "不序列化的字段,是不会被转json输出的");
        System.out.println(bird.toString());
        String s = JsonUtils.parseObjToJson(bird);
        System.out.println(s);
        Bird deserialize = JsonUtils.parseJsonToObj(s, Bird.class);
        System.out.println(deserialize == null ? "" : deserialize.toString());
    }

上面是测试方法,然后看运行结果:

JSONField 不生效怎么办 java @jsonfield_序列化

分析一下:

大致步骤。先是序列化为json字符串。然后再从字符串变成对象,反序列化。

1,ordinal

这个值的设置,可以使对象的属性按这个顺序来输出,默认值是0,要是都不设置,那就按属性名称的字母顺序来输出,我不嫌弃麻烦,还真就删除model类里面的注解,又执行了一下,看下图的效果。可以和上面的那个对比一下。

JSONField 不生效怎么办 java @jsonfield_序列化_02

可以看到,默认是按照属性的名称的字母顺序输出的。我这依次是a b c d n s开头的属性名称。

2,name

这个name厉害,直接把原来的属性名称代码,给替换成别名(姑且这么叫吧)这样子的话,这个json的易读性就大大提高啦。具体可以看下执行结果截图中的,自定义的toString方法的返回和json之后的差别。

3,format

这个针对日期属性,至于他的值,你可以随意设置格式化格式,前提是复合那个SimpleDateFormat这个类的格式化时间的格式就好,估计是通用的。可以参考下面这个连接,看看格式化日期的格式如何设置。

java 日期格式化-- SimpleDateFormat 的使用。字符串转日期,日期转字符串

4,serialize

序列化,默认值是true,都是序列化的,我在model里面设置了个false,然后可以看到,在输出json字符串中,这个属性对应的key和value都不见啦。就是这么个作用。

5,deserialize

这个反序列化,默认值也是true,默认都是需要反序列化的,我对name属性设置是false,在字符串转对象对时候,发现对象对name属性是null啦。就是这么个作用。

6,jsonDirect

这个说是,如果对象对某个属性的值是json字符串的话,就不要在做处理啦,直接就是json。对此我也测试了下,但是出了点问题。具体看执行效果图。

JSONField 不生效怎么办 java @jsonfield_反序列化_03

JSONField 不生效怎么办 java @jsonfield_json_04

可以看到,序列化是没毛病的,但是在反序列化的时候,就失败了,具体原因嘛,

//(他在解析那个属性是直接json的时候,出错了,也就是json属性值没带斜杆的时候,出的问题。)

最后,看下他的源码类:

/*
 * Copyright 1999-2101 Alibaba Group.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.fastjson.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * @author wenshao[szujobs@hotmail.com]
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
    /**
     * config encode/decode ordinal
     * @since 1.1.42
     * @return
     */
    int ordinal() default 0;

    String name() default "";

    String format() default "";

    boolean serialize() default true;

    boolean deserialize() default true;

    SerializerFeature[] serialzeFeatures() default {};

    Feature[] parseFeatures() default {};
    
    String label() default "";
    
    /**
     * @since 1.2.12
     */
    boolean jsonDirect() default false;
    
    /**
     * Serializer class to use for serializing associated value.
     * 
     * @since 1.2.16
     */
    Class<?> serializeUsing() default Void.class;
    
    /**
     * Deserializer class to use for deserializing associated value. 
     * 
     * @since 1.2.16 
     */
    Class<?> deserializeUsing() default Void.class;

    /**
     * @since 1.2.21
     * @return the alternative names of the field when it is deserialized
     */
    String[] alternateNames() default {};
}

属性不少啊,还有几个是使用指定的序列化类进行序列化和反序列化。label,没实验出来干啥的,等等吧。