一、 kotson 使用
参考kotson 的github 链接:https://github.com/SalomonBrys/Kotson
implementation 'com.github.salomonbrys.kotson:kotson:2.5.0'
特点
支持data 类的解析,不需要写默认值
泛型解析上很方便,不再需要指出对应的TypeToken,fastjson对应的是(TypeReference)。这个真心是方便了
读取 字段方便
demo
package com.fangtao.json
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.github.salomonbrys.kotson.fromJson
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.TypeAdapterFactory
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var str = "{\n" +
" \"code\": null, \n" +
" \"result\": {\n" +
" \"msg\": \"\", \n" +
" \"token\": \"6d37180f-5cdf-d070-65a6-54d279e3482e\"\n" +
" }\n" +
"}"
var s : LoginModel.Companion.Login = StringNullAdapter.gson.fromJson(str)
Log.e("code",s.code)
Log.e("msg",s.result!!.msg)
Log.e("token",s.result!!.token)
Log.e("account",s.result!!.account)
tv.text = "account:"+s.result!!.account
var str2 = "{\n" +
" \"code\": 0, \n" +
" \"result\": {\n" +
" \"total\": 3, \n" +
" \"per_page\": 10, \n" +
" \"current_page\": 1, \n" +
" \"last_page\": 1, \n" +
" \"data\": [\n" +
" {\n" +
" \"betorderno\": \"局号:A0****685395\", \n" +
" \"betamount\": \"4.00\", \n" +
" \"netpnl\": \"-4.00\", \n" +
" \"bettime\": \"2019-03-06 07:33:18\"\n" +
" }, \n" +
" {\n" +
" \"betorderno\": \"局号:A0****638962\", \n" +
" \"betamount\": \"2.00\", \n" +
" \"netpnl\": \"2.00\", \n" +
" \"bettime\": \"2019-03-06 07:30:18\"\n" +
" }, \n" +
" {\n" +
" \"betorderno\": \"局号:A0****364841\", \n" +
" \"betamount\": \"2.00\", \n" +
" \"netpnl\": \"-2.00\", \n" +
" \"bettime\": \"2019-03-06 07:11:31\"\n" +
" }\n" +
" ]\n" +
" }\n" +
"}"
var bll : GameBill.game_bill = StringNullAdapter.gson.fromJson(str2)
Log.e("per_page",bll.result!!.per_page)
var list = bll.result!!.data
for (item in list){
Log.w("betorderno",item.betorderno)
Log.w("betamount",item.betamount)
Log.w("bettime",item.bettime)
}
}
}
StringNullAdapter.java
package com.fangtao.json;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
public class StringNullAdapter extends TypeAdapter<String> {
@Override
public String read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return "";
}
return reader.nextString();
}
@Override
public void write(JsonWriter writer, String value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
}
public static final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringEmptyTypeAdapterFactory()).create();
}
NullStringEmptyTypeAdapterFactory.java
package com.fangtao.json;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
public class NullStringEmptyTypeAdapterFactory<T> implements TypeAdapterFactory {
@SuppressWarnings("unchecked")
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
Class<T> rawType = (Class<T>) type.getRawType();
if (rawType != String.class) {
return null;
}
return (TypeAdapter<T>) new StringNullAdapter();
}
}
GameBill.java
package com.fangtao.json
class GameBill{
data class game_bill(
val code:String = "", //注意 这个给个默认值,json解析的时候就算为空或者没有这个字段,调用的时候就会返回一个默认值
val result: result?
)
data class result(
val total:String = "",
val per_page:String = "",
val current_page:String = "",
val last_page:String = "",
val data:ArrayList<data>
)
data class data(
val betorderno:String = "",
val betamount:String = "",
val netpnl:String = "",
val bettime:String = ""
)
}
网友评论