一、 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 {

@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 implements TypeAdapterFactory {

@SuppressWarnings("unchecked")

public TypeAdapter create(Gson gson, TypeToken type) {

Class rawType = (Class) type.getRawType();

if (rawType != String.class) {

return null;

}

return (TypeAdapter) 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 class data(

val betorderno:String = "",

val betamount:String = "",

val netpnl:String = "",

val bettime:String = ""

)

}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐