gson所需依赖包github
1.什么是gson
gson是用来进行json和对象之间互相转化的一个工具,并且是谷歌出品
2.gson,fastJson,org.json
相同点
首先这三者都是用来将json和对象互转的工具包
不同点
fastJson和org.json需要主动创建对象,然后解析json字符串将值塞入对象对应的成员变量上
gson不需要手动上述操作,只需要配置好对应的实体类,一行代码就能完成json和对象之间的互转
3.gson实例解析
待解析的json字符串
{
"share_config": {
"base_host": "https://www.baidu.com",
"cc": {
"facebook": {
"prefix": "/photo",
"short": true
},
"QQ": {
"prefix": "/photo",
"short": true
},
"WeiXin": {
"prefix": "/photo",
"short": true
}
}
}
}
实体类的配置
public class ConfigResponse {
@SerializedName("share_config")
public ShareConfig mShareConfig;
public static class ShareConfig {
@SerializedName("base_host")
public String mBaseUrl;
@SerializedName("cc")
// public Map<String, Object> mPlatforms;
// public String mPlatforms; //直接蹦
public JsonObject mPlatforms; //要用gson下的JsonObject
}
}
配置的原则是一个JsonObject就对应的一个实体类
关于cc的配法
前面说了一个JsonObject就对应的一个实体对象,cc中有3个JsonObject,应该对应3个实体类,但是需求是cc中可能有0个或多个,因此不能用实体类来配置
关于如何配置这种数量不固定的,有两种方法
1.让服务端更改json,即改成JsonArray
//json配置
{
"share_config": {
"base_host": "https://m.kwai.com",
"cc": [
{
"name":"facebook",
"prefix": "/photo",
"short": true
},
{
"name":"QQ",
"prefix": "/photo",
"short": true
},
{
"name":"WeiXin",
"prefix": "/photo",
"short": true
}
]
}
}
//实体类配置
public class ConfigResponse1 {
@SerializedName("share_config")
public ConfigResponse1.ShareConfig mShareConfig;
public static class ShareConfig {
@SerializedName("base_host")
public String mBaseUrl;
@SerializedName("cc")
public List<SharePlatform> mPlatforms;
}
public static class SharePlatform {
@SerializedName("name")
public String mName;
@SerializedName("prefix")
public String mPrefix;
@SerializedName("short")
public boolean mShort;
}
}
2.服务端不肯更改,注释已经给了很清晰的注释,当然也是可以解析成Map的,解析成JsonObject是为了更方便的解析
一行代码将json转化成对象
String json= AssetUtil.getJson("json/config.json",this);
ConfigResponse configResponse=new Gson().fromJson(json,ConfigResponse.class);
其中json就是前面的json字符串
解析出facebook这个json中的值
1.先解析出ShareConfig中的值
ConfigResponse.ShareConfig shareConfig=configResponse.mShareConfig;
JsonObject jsonObj=shareConfig.mPlatforms;
Log.d("TAG",configResponse.mShareConfig.mBaseUrl);
Log.d("TAG",jsonObj.toString());
Log输出
https://m.kwai.com
{"facebook":{"prefix":"/photo","short":true},"QQ":{"prefix":"/photo","short":true},"WeiXin":{"prefix":"/photo","short":true}}
2.解析出facebook
JsonObject jsonObject=jsonObj.getAsJsonObject("facebook");
String prefix=jsonObject.get("prefix").getAsString();
boolean mShort=jsonObject.get("short").getAsBoolean();
Log.d("TAG","prefix:"+prefix);
Log.d("TAG","short:"+mShort);
Log输出
prefix:/photo
short:true
可以用map解析的json格式
{
"cc":{
"wecaht":"微信",
"alipay":"支付宝"
}
}
对应的实体类配置
@SerializedName("cc")
public Map<String,String> mPlatforms;
String转化成json
new JsonParser().parse("jsonString").getAsJsonObject();
4.后续会更新其它使用技巧
4.1 转化的技巧
params格式如下
params:{
url: 分享链接
title:标题
desc: 副标题
}
解析1,实体类
@SerializedName("params")
public Params params;
解析2,map
@SerializedName("params")
public Map<String, String> params;
解析3,json
@SerializedName("params")
public JsonObject params;
JsonDeserializer和JsonSerializer