fastjson使用の詳細

23051 ワード

一、fastjson紹介
前後端のデータ転送インタラクションでは、文字列(String)とjsonXMLなどのフォーマットの相互変換と解析に遭遇することが多く、そのうちjsonは言語にまたがり、前後端にまたがる利点が開発で頻繁に使用され、基本的には標準的なデータ交換フォーマットと言える.fastjsonはjava言語で作成された高性能で機能的なJSONライブラリで、「仮定秩序高速マッチング」のアルゴリズムを採用し、JSON Parseの性能を極致に向上させた.インタフェースは簡単で使いやすく、キャッシュシーケンス化、プロトコルインタラクション、Web出力など様々なアプリケーションシーンで広く使われています.
FastJsonは、JSON形式のデータの解析とパッケージングに使用される、バーリバのオープンソースライブラリです.
特徴は以下の通りである.
(1)java beanをJSON文字列にシーケンス化することをサポートすることもできるし、JSON文字列をJava beanに逆シーケンス化することもできる.
(2)その名の通り,fastjson操作JSONの速度は非常に速い.
(3)他のパケットの依存はない.
(4)使いやすい.
二、fastjson使用
Mavenプロジェクトでfastjsonライブラリを使用するには、fastjsonファイルなどのpom.xmlパッケージの依存関係を事前にMavenのプロファイルに追加する必要があります.
次の依存を追加します.

    com.alibaba
    fastjson
    
            

単独練習で使用する場合は、対応するjar導入項目をダウンロードすればよい.
JArダウンロードアドレス:fastjson-1.2.58.jar
三、fastjson常用APIfastjson APIエントリクラスはcom.alibaba.fastjson.JSONであり、一般的なシーケンス化操作はJSONクラス上の静的方法で直接完了することができる.
public static final Object parse(String text); //  JSON  parse JSONObject  JSONArray

public static final JSONObject parseObject(String text); //  JSON  parse JSONObject 
    
public static final  T parseObject(String text, Class clazz); //  JSON  parse JavaBean 

public static final JSONArray parseArray(String text); //  JSON  parse JSONArray 

public static final  List parseArray(String text, Class clazz); // JSON  parse JavaBean   

public static final String toJSONString(Object object); //  JavaBean    JSON   

public static final String toJSONString(Object object, boolean prettyFormat); //  JavaBean        JSON   

public static final Object toJSON(Object javaObject); // JavaBean   JSONObject  JSONArray。

四、fastjson使用デモ
テストクラスの準備
Userクラス
public class User {
    private String username;
    private String password;
    public User(){}
    public User(String username,String password){
        this.username = username;
        this.password = password;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
}

UserGroupクラス:このクラスにはUserクラスの集合が含まれています.
import java.util.ArrayList;
import java.util.List;

public class UserGroup {
    private String name;  
    private List users = new ArrayList();
    public UserGroup(){}
    public UserGroup(String name,List users){
        this.name = name;
        this.users = users;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List getUsers() {
        return users;
    }
    public void setUsers(List users) {
        this.users = users;
    }
    @Override
    public String toString() {
        return "UserGroup [name=" + name + ", users=" + users + "]";
    }  
}

1.javaクラスをjson文字列に変換
package javabasic.json;

import com.alibaba.fastjson.JSON;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: fastjson API    
 * @Author: ggf
 * @Date: 2020/01/11
 */
public class FastJsonTest {
    /**
     * java     json   
     */
    @Test
    public void objToJson() {
        //       
        User user = new User("ggf","123456");
        //   toJSONString()
        String userJson = JSON.toJSONString(user);
        System.out.println("java    json :" + userJson);

        //   (List) json 
        User user1 = new User("zhangsan", "123456");
        User user2 = new User("lisi", "654321");
        //        
        List users = new ArrayList();
        users.add(user1);
        users.add(user2);
        //   toJSONString()    
        String usersjson = JSON.toJSONString(users);
        System.out.println("  (List) json :" + usersjson);

        //   java (        )  json 
        UserGroup userGroup = new UserGroup("userGroup", users);
        //   toJSONString()    
        String userGroupJson = JSON.toJSONString(userGroup);
        System.out.println("  java (        )  json :" + userGroupJson);

    }
}

出力結果:
java    json :{"password":"123456","username":"ggf"}

  (List) json :[{"password":"123456","username":"zhangsan"},{"password":"654321","username":"lisi"}]

  java (        )  json :{"name":"userGroup","users":[{"password":"123456","username":"zhangsan"},{"password":"654321","username":"lisi"}]}

2.json文字列をjavaクラスに変換
package javabasic.json;

import com.alibaba.fastjson.JSON;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: fastjson API    
 * @Author: ggf
 * @Date: 2020/01/11
 */
public class FastJsonTest {
    /**
     * json     java 
     *  :              (" --> \"),         ,       。
     * json  “{}”  ,   java  ,  :parseObject();
     * json  “[]”  ,   java  ,  :parseArray();
     */
    @Test
    public void jsonToObj() {
        /* json      java  
         *    :{"password":"123456","username":"dmego"}
         */
        String jsonStr1 = "{'password':'123456','username':'ggf'}";
        //   parseObject()
        User user = JSON.parseObject(jsonStr1, User.class);
        System.out.println("json      java  :"+user.toString());

        /*
         * json    List  
         *    :[{"password":"123123","username":"zhangsan"},
         *        {"password":"321321","username":"lisi"}]
         */
        String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]";
        //   parseArray()        
        List users = JSON.parseArray(jsonStr2, User.class);
        System.out.println("json    List  :"+users.toString());

        /*json      java  
         *    :{"name":"userGroup","users":[{"password":"123123","username":"zhangsan"},{"password":"321321","username":"lisi"}]}
         * */
        String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}";
        UserGroup userGroup = JSON.parseObject(jsonStr3, UserGroup.class);
        System.out.println("json      java  :"+userGroup);
    }
}

出力結果:
json      java  :User [username=ggf, password=123456]
    
json    List  :[User [username=zhangsan, password=123123], User [username=lisi, password=321321]]

json      java  :UserGroup [name=userGroup, users=[User [username=zhangsan, password=123123], User [username=lisi, password=321321]]]

五、fastjsonの実際の開発応用
1.複雑なjson列をjavaクラスに変換する
まず、羊肉スープのレシピであるjson文字列があります.データは「集約データ」に由来しています.
{
  "resultcode":"200",
  "reason":"Success",
  "result":{
    "data":[
      {
        "id":"6269",
        "title":"   ",
        "tags":"     ; ;   ; ;  ",
        "imtro":"          ,             ,         ,      “   ”,                。             ;“  ,        ”。          ,       、               。             ,         ,         ,“    ”    。         ,                    ,           。                 ,                 。          ,    ,          。            ,    ,                  ,   “ ”!",
        "ingredients":"   ,500g;  ,1000g",
        "burden":"  ,  ;  ,  ;  ,  ;  ,  ;   ,  ;   ,  ",
        "albums":[
          "http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/t\/7\/6269_379835.jpg"
        ],
        "steps":[
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_95d65e77b58a1b6b.jpg",
            "step":"1.          。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a8136c10401a1643.jpg",
            "step":"2.       ,     ,       。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7b1c9fc85ddc6de.jpg",
            "step":"3.       ,                。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_2b284dc30b4f0875.jpg",
            "step":"4.   40  ,      。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7ade6439eb2db5a.jpg",
            "step":"5.    ,           30  。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_579748e3b0f15963.jpg",
            "step":"6.       ,      。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_1550e6f127aa1077.jpg",
            "step":"7.      ,    。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a2c965d77b96da70.jpg",
            "step":"8.     ,               。"
          },
          {
            "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_eea9b807d1dc5995.jpg",
            "step":"9.              ,         。"
          }
        ]
      }
    ],
    "totalNum":"9",
    "pn":0,
    "rn":"1"
  },
  "error_code":0
}

このような複雑な文字列を解析するには、javaクラスに変換するには、まずそれに一致するjava POJOオブジェクトを定義しなければなりません.上のjson文字列の構成から見ると、4つのbeanを分割することができます.
最外層の応答:ResponseData結果を返します:ResultBeanデータ:DataBean調理手順:StepsBean取得したjson文字列データをGsonFormatツールでjavaクラスを生成します.
GsonFormatツールの使用については、次の文書を参照してください.https://www.cnblogs.com/1024zy/p/6370305.html
package javabasic.json;

import java.util.List;

/**
 * @Description:        
 *   GsonFormat    
 * @Author: ggf
 * @Date: 2020/01/11
 */
public class ResponseData {
    private String resultcode;
    private String reason;
    private ResultBean result;
    private int error_code;

    public String getResultcode() {
        return resultcode;
    }

    public void setResultcode(String resultcode) {
        this.resultcode = resultcode;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public ResultBean getResult() {
        return result;
    }

    public void setResult(ResultBean result) {
        this.result = result;
    }

    public int getError_code() {
        return error_code;
    }

    public void setError_code(int error_code) {
        this.error_code = error_code;
    }

    @Override
    public String toString() {
        return "ResponseData{" +
                "resultcode='" + resultcode + '\'' +
                ", reason='" + reason + '\'' +
                ", result=" + result +
                ", error_code=" + error_code +
                '}';
    }

    public static class ResultBean {

        private String totalNum;
        private int pn;
        private String rn;
        private List data;

        public String getTotalNum() {
            return totalNum;
        }

        public void setTotalNum(String totalNum) {
            this.totalNum = totalNum;
        }

        public int getPn() {
            return pn;
        }

        public void setPn(int pn) {
            this.pn = pn;
        }

        public String getRn() {
            return rn;
        }

        public void setRn(String rn) {
            this.rn = rn;
        }

        public List getData() {
            return data;
        }

        public void setData(List data) {
            this.data = data;
        }

        @Override
        public String toString() {
            return "ResultBean{" +
                    "totalNum='" + totalNum + '\'' +
                    ", pn=" + pn +
                    ", rn='" + rn + '\'' +
                    ", data=" + data +
                    '}';
        }

        public static class DataBean {
        
            private String id;
            private String title;
            private String tags;
            private String imtro;
            private String ingredients;
            private String burden;
            private List albums;
            private List steps;

            public String getId() {
                return id;
            }

            public void setId(String id) {
                this.id = id;
            }

            public String getTitle() {
                return title;
            }

            public void setTitle(String title) {
                this.title = title;
            }

            public String getTags() {
                return tags;
            }

            public void setTags(String tags) {
                this.tags = tags;
            }

            public String getImtro() {
                return imtro;
            }

            public void setImtro(String imtro) {
                this.imtro = imtro;
            }

            public String getIngredients() {
                return ingredients;
            }

            public void setIngredients(String ingredients) {
                this.ingredients = ingredients;
            }

            public String getBurden() {
                return burden;
            }

            public void setBurden(String burden) {
                this.burden = burden;
            }

            public List getAlbums() {
                return albums;
            }

            public void setAlbums(List albums) {
                this.albums = albums;
            }

            public List getSteps() {
                return steps;
            }

            public void setSteps(List steps) {
                this.steps = steps;
            }

            @Override
            public String toString() {
                return "DataBean{" +
                        "id='" + id + '\'' +
                        ", title='" + title + '\'' +
                        ", tags='" + tags + '\'' +
                        ", imtro='" + imtro + '\'' +
                        ", ingredients='" + ingredients + '\'' +
                        ", burden='" + burden + '\'' +
                        ", albums=" + albums +
                        ", steps=" + steps +
                        '}';
            }

            public static class StepsBean {        

                private String img;
                private String step;

                public String getImg() {
                    return img;
                }

                public void setImg(String img) {
                    this.img = img;
                }

                public String getStep() {
                    return step;
                }

                public void setStep(String step) {
                    this.step = step;
                }

                @Override
                public String toString() {
                    return "StepsBean{" +
                            "img='" + img + '\'' +
                            ", step='" + step + '\'' +
                            '}';
                }
            }
        }
    }
}

対応するエンティティクラスが作成されると、fastjsonのメソッドを使用してjson列をオブジェクトに変換して使用できます.
package javabasic.json;

import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.util.IOUtils;
import org.junit.Test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: fastjson API    
 * @Author: ggf
 * @Date: 2020/01/11
 */
public class FastJsonTest {

    /**
    *    json    java 
    */
    @Test
    public void jsonToComplexObj() {
        //        caipu.json  ,          hutool    json  
        //      :https://hutool.cn/docs/#/
        String jsonStr = FileUtil.readUtf8String("./javabasic/json/caipu.json");
        System.out.println(jsonStr);
        //    java 
        ResponseData resp = JSON.parseObject(jsonStr, ResponseData.class);
        System.out.println(resp);

        //         
        //      resultcode
        System.out.println(resp.getResultcode());
        //       
        ResponseData.ResultBean result = resp.getResult();
        System.out.println("result    :" + result);

    }
}

出力結果

ResponseData{resultcode='200', reason='Success', result=ResultBean{totalNum='9', pn=0, rn='1', data=[DataBean{id='6269', title='   ', tags='     ; ;   ; ;  ', imtro='          ,             ,         ,      “   ”,                。             ;“  ,        ”。          ,       、               。             ,         ,         ,“    ”    。         ,                    ,           。                 ,                 。          ,    ,          。            ,    ,                  ,   “ ”!', ingredients='   ,500g;  ,1000g', burden='  ,  ;  ,  ;  ,  ;  ,  ;   ,  ;   ,  ', albums=[http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg], steps=[StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg', step='1.          。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a8136c10401a1643.jpg', step='2.       ,     ,       。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7b1c9fc85ddc6de.jpg', step='3.       ,                。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_2b284dc30b4f0875.jpg', step='4.   40  ,      。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7ade6439eb2db5a.jpg', step='5.    ,           30  。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_579748e3b0f15963.jpg', step='6.       ,      。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_1550e6f127aa1077.jpg', step='7.      ,    。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a2c965d77b96da70.jpg', step='8.     ,               。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_eea9b807d1dc5995.jpg', step='9.              ,         。'}]}]}, error_code=0}

2.json列に対する操作
実際の開発では,インタフェースから返されるjsonデータを操作し,中のいくつかのデータを取得することが多い.やはり上記のjson文字列を例にfastjsonを用いてjson文字列を操作する.
package javabasic.json;

import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.util.IOUtils;
import org.junit.Test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: fastjson API    
 * @Author: ggf
 * @Date: 2020/01/11
 */
public class FastJsonTest {
    /**
     *  json    
     */
    @Test
    public void operateJson() {
        //     json  
        String jsonStr = FileUtil.readUtf8String("./javabasic/json/caipu.json");
        //   json  
        JSONObject jsonObj = JSONObject.parseObject(jsonStr);
        //   json  
        //      resultcode
        System.out.println(jsonObj.get("resultcode"));
        //       reason
        System.out.println(jsonObj.getString("reason"));
        //   data
        JSONObject resJsonObj = (JSONObject)jsonObj.get("result");
        System.out.println(resJsonObj.getString("data"));

    }

}

出力結果
200
    
Success
    
[{"albums":["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"],
  .......       
 "}]

六、fastjson脆弱性問題
参考資料:https://www.cnblogs.com/chaos-li/p/11139992.html
実際のプロジェクトで使用される建設使用バージョンは1.2.45より大きい.
七、fastjson踏み込み
シーケンス化されたクラスには、パラメータなしで構築する方法が必要です.
シーケンス化されたクラスには、パラメータなしの構造方法が必要です.エラーが発生しますException in thread "main" com.alibaba.fastjson.JSONException: default constructor not found. class Userコンストラクションメソッドを書き換えていない場合は、各クラスにパラメータなしのコンストラクションメソッドが用意されていますが、パラメータ付きのコンストラクションメソッドを書き換えると、デフォルトのパラメータなしコンストラクションメソッドが上書きされ、手動でパラメータなしのコンストラクションメソッドを書く必要があります.だから私は保険のためにjsonシーケンス化されるクラスを手動で無参の構造方法を書くことをお勧めします.
低バージョンで変換すると、上記の異常情報が直接投げ出されます(テストバージョン:fastjson-1.1.12).しかし、高バージョン(fastjson-1.2.58)は間違いを報告しません.Javabeanを定義するときに、無パラメータと有パラメータを定義することをお勧めします.
【参考文献】
https://www.cnblogs.com/dmego/p/9033080.html https://blog.csdn.net/zgzczzw/article/details/72330190 https://blog.csdn.net/JLoveforever/article/details/79885485