fastjson使用の詳細
23051 ワード
一、fastjson紹介
前後端のデータ転送インタラクションでは、文字列(String)と
FastJsonは、JSON形式のデータの解析とパッケージングに使用される、バーリバのオープンソースライブラリです.
特徴は以下の通りである.
(1)java beanを
(2)その名の通り,
(3)他のパケットの依存はない.
(4)使いやすい.
二、fastjson使用
Mavenプロジェクトで
次の依存を追加します.
単独練習で使用する場合は、対応する
JArダウンロードアドレス:fastjson-1.2.58.jar
三、fastjson常用API
四、fastjson使用デモ
テストクラスの準備
Userクラス
UserGroupクラス:このクラスにはUserクラスの集合が含まれています.
1.javaクラスをjson文字列に変換
出力結果:
2.json文字列をjavaクラスに変換
出力結果:
五、fastjsonの実際の開発応用
1.複雑なjson列をjavaクラスに変換する
まず、羊肉スープのレシピであるjson文字列があります.データは「集約データ」に由来しています.
このような複雑な文字列を解析するには、javaクラスに変換するには、まずそれに一致する
最外層の応答:
GsonFormatツールの使用については、次の文書を参照してください.https://www.cnblogs.com/1024zy/p/6370305.html
対応するエンティティクラスが作成されると、fastjsonのメソッドを使用してjson列をオブジェクトに変換して使用できます.
出力結果
2.json列に対する操作
実際の開発では,インタフェースから返されるjsonデータを操作し,中のいくつかのデータを取得することが多い.やはり上記のjson文字列を例にfastjsonを用いてjson文字列を操作する.
出力結果
六、fastjson脆弱性問題
参考資料:https://www.cnblogs.com/chaos-li/p/11139992.html
実際のプロジェクトで使用される建設使用バージョンは1.2.45より大きい.
七、fastjson踏み込み
シーケンス化されたクラスには、パラメータなしで構築する方法が必要です.
シーケンス化されたクラスには、パラメータなしの構造方法が必要です.エラーが発生します
低バージョンで変換すると、上記の異常情報が直接投げ出されます(テストバージョン: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
前後端のデータ転送インタラクションでは、文字列(String)と
json
、XML
などのフォーマットの相互変換と解析に遭遇することが多く、そのうち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常用API
fastjson 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
出力結果:
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