zoukankan      html  css  js  c++  java
  • fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配

    一、demo代码

    @JSONField注解属性字段上与set、get方法上。使用@Data注解(lombok插件安装最下方),对属性“笔名”【pseudonym】手动重写setter/getter方法

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.alibaba.fastjson.annotation.JSONField;
    import lombok.Data;
    
    @Data
    public class Stu {
    
        private String name;
        //下划线自动转换
        private String alias_name;
    
        //下划线自动转换
    //    @JSONField(name="pen_name")
        private String penName;
    
        //实体类转为json,使用注解name值
        @JSONField(name="pen_name2")
        private String penName2;
    
    
        private String pseudonym;
    
        //实体类转为json,使用注解name值
        @JSONField(name="pseud")
        //不使用注解为属性名{"penName":"333","name":"1111","alias_name":"222","pen_name2":"444","pseudonym":"555"}
        public String getPseudonym() {
            return pseudonym;
        }
    
        //json转为实体类,使用注解name值
        @JSONField(name="pseudo")
        public void setPseudonym(String pseudonym) {
            this.pseudonym = pseudonym;
        }
    
        public static void main(String[] args) {
            String json = "{'name':'1111','aliasName':'222','pen_name':'333','pen_name2':'444','pseudo':'555'}";
            Stu stu = JSON.parseObject(json, Stu.class);
    
            System.out.println(stu);
            System.out.println(JSONObject.toJSON(stu));
        }
    }

    二、main方法运行结果(控制台)

    Stu(name=1111, alias_name=222, penName=333, penName2=444, pseudonym=555)
    {"pseud":"555","penName":"333","name":"1111","alias_name":"222","pen_name2":"444"}
    
    Process finished with exit code 0

    三、@Data备注

    idea安装lombok插件。

    四、源码

    类:

    JavaBeanDeserializer implements ObjectDeserializer

    public FieldDeserializer smartMatch(String key, int[] setFlags) {
            if (key == null) {
                return null;
            } else {
                FieldDeserializer fieldDeserializer = this.getFieldDeserializer(key, setFlags);
                if (fieldDeserializer == null) {
                    long smartKeyHash = TypeUtils.fnv1a_64_lower(key);
                    if (this.smartMatchHashArray == null) {
                        long[] hashArray = new long[this.sortedFieldDeserializers.length];
    
                        for(int i = 0; i < this.sortedFieldDeserializers.length; ++i) {
                            hashArray[i] = TypeUtils.fnv1a_64_lower(this.sortedFieldDeserializers[i].fieldInfo.name);
                        }
    
                        Arrays.sort(hashArray);
                        this.smartMatchHashArray = hashArray;
                    }
    
                    int pos = Arrays.binarySearch(this.smartMatchHashArray, smartKeyHash);
                    boolean is = false;
                    if (pos < 0 && (is = key.startsWith("is"))) {
                        smartKeyHash = TypeUtils.fnv1a_64_lower(key.substring(2));
                        pos = Arrays.binarySearch(this.smartMatchHashArray, smartKeyHash);
                    }
    
                    if (pos >= 0) {
                        if (this.smartMatchHashArrayMapping == null) {
                            short[] mapping = new short[this.smartMatchHashArray.length];
                            Arrays.fill(mapping, (short)-1);
    
                            for(int i = 0; i < this.sortedFieldDeserializers.length; ++i) {
                                int p = Arrays.binarySearch(this.smartMatchHashArray, TypeUtils.fnv1a_64_lower(this.sortedFieldDeserializers[i].fieldInfo.name));
                                if (p >= 0) {
                                    mapping[p] = (short)i;
                                }
                            }
    
                            this.smartMatchHashArrayMapping = mapping;
                        }
    
                        int deserIndex = this.smartMatchHashArrayMapping[pos];
                        if (deserIndex != -1 && !isSetFlag(deserIndex, setFlags)) {
                            fieldDeserializer = this.sortedFieldDeserializers[deserIndex];
                        }
                    }
    
                    if (fieldDeserializer != null) {
                        FieldInfo fieldInfo = fieldDeserializer.fieldInfo;
                        if ((fieldInfo.parserFeatures & Feature.DisableFieldSmartMatch.mask) != 0) {
                            return null;
                        }
    
                        Class fieldClass = fieldInfo.fieldClass;
                        if (is && fieldClass != Boolean.TYPE && fieldClass != Boolean.class) {
                            fieldDeserializer = null;
                        }
                    }
                }
    
                return fieldDeserializer;
            }
        }

    “_”下划线及“-”短横线(减号),大小写都可以智能匹配。

    类:

    TypeUtils
     public static long fnv1a_64_lower(String key) {
            long hashCode = -3750763034362895579L;
    
            for(int i = 0; i < key.length(); ++i) {
                char ch = key.charAt(i);
                if (ch != '_' && ch != '-') {
                    if (ch >= 'A' && ch <= 'Z') {
                        ch = (char)(ch + 32);
                    }
    
                    hashCode ^= (long)ch;
                    hashCode *= 1099511628211L;
                }
            }
    
            return hashCode;
        }
  • 相关阅读:
    主效应|处理误差 |组间误差|处理效应|随机误差|组内误差|误差|效应分析|方差齐性检验|SSE|SSA|SST|MSE|MSA|F检验|关系系数|完全随机化设计|区组设计|析因分析
    第二类错误|检验统计量|左偏|右偏|P值
    估计量|估计值|置信度|置信水平|非正态的小样本|t分布|大样本抽样分布|总体方差|
    参数|统计量|抽样分布|估计标准误差|标准误差|标准误|标准差|二项分布|泊松分布|中心极限定理|样本方差|
    ruby 分析日志,提取特定记录
    find 找出大文件
    momentjs 求小时差异
    linux下对date和timestamp的互转
    golang protobuf SetExtension
    对文本中的某两列求和,请统计重复出现次数
  • 原文地址:https://www.cnblogs.com/foolash/p/11747828.html
Copyright © 2011-2022 走看看