Android Kotlin Json处理,避免null闪退

2019-03-14  本文已影响0人  我是涛锅锅

一、 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 = ""
    )
}
上一篇 下一篇

猜你喜欢

热点阅读