Android对接.net(C#)服务端(一):解析DataTable、DataSet类型及分页的Json数据

〇、前言

在.net平台C#中有DataTable和DataSet类型的对象,并且非常方便和常用。我们目前项目的服务端采用C#进行开发,在给前台返回响应数据时是直接将DataTable和DataSet类型的对象进行Json序列化后进行返回。Android下并没有与此对应的DataTable和DataSet对象,所以Android端接收到响应数据时第一件事就是对Json数据进行解析,对于此类固定的格式好的做法是统一在底层进行解析,直接给业务层返回可用的List数据。所以我封装了两个分别解析DataTable和DataSet类型的Json数据的工具类。

一、解析DataTable类型的Json数据

DataTable类型的数据示例如下:

{"TableName":"dt","Table":[{"Row":"1","MACHINE_INSTANCE_ID":"66848","PLANT_ID":"5","PLANT_NAME":"总装1#生产车间","WS_ID":"214","MACHINE_PRODUCT_ID":"2935","SERIES_NAME":"精雕","MODEL_NAME":"CarverPMS23_A8","PRODUCT_CODE":"5593.0033.110014","MAC_POSITION":"A-2-1","PROCESS_BARCODE":"INL01312003418","MACHINE_STATE":"1","MAC_WS_ID":"68622","MAC_AREA_WIDTH":"2000","MAC_AREA_HEIGHT":"2000","PROGRESS_STATE":"59","TEST_CODE":"648","PRODUCT_STATE":"5"},{"Row":"2","MACHINE_INSTANCE_ID":"67280","PLANT_ID":"5","PLANT_NAME":"总装1#生产车间","WS_ID":"214","MACHINE_PRODUCT_ID":"641","SERIES_NAME":"精雕","MODEL_NAME":"JDLVG400E-A8","PRODUCT_CODE":"5593.0053.110032","MAC_POSITION":"A-2-3","PROCESS_BARCODE":"INL01312003474","MACHINE_STATE":"1","MAC_WS_ID":"68880","MAC_AREA_WIDTH":"2500","MAC_AREA_HEIGHT":"2000","PROGRESS_STATE":"55","TEST_CODE":"107","PRODUCT_STATE":"5"},{"Row":"3","MACHINE_INSTANCE_ID":"67279","PLANT_ID":"5","PLANT_NAME":"总装1#生产车间","WS_ID":"214","MACHINE_PRODUCT_ID":"641","SERIES_NAME":"精雕","MODEL_NAME":"JDLVG400E-A8","PRODUCT_CODE":"5593.0053.110032","MAC_POSITION":"A-2-4","PROCESS_BARCODE":"INL01312003473","MACHINE_STATE":"1","MAC_WS_ID":"68881","MAC_AREA_WIDTH":"2500","MAC_AREA_HEIGHT":"2000","PROGRESS_STATE":"55","TEST_CODE":"106","PRODUCT_STATE":"5"}]}

DataTable类型的数据就是行集合外加表名的封装,以此对应来进行Json解析,如下:

import com.google.gson.Gson;
import com.google.gson.JsonElement;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**
 * Description: 用于Json格式字符串数据传输的DataTable类型。
 * Copyright  : Copyright (c) 2020
 * Author     : mliuxb
 * Date       : 2021-03-11 09:00
 */
public class DataTable<T> {

    public String TableName;    //表名
    public ArrayList<T> Table;  //行集合

    /**
     * 构造函数
     * @param tableName
     *         表名
     */
    public DataTable(String tableName) {
        TableName = tableName;
        Table = new ArrayList<>();
    }

    @NonNull
    private static <T> ParameterizedType getType(@NonNull final Class<T> cls) {
        return new ParameterizedType() {
            @NonNull
            @Override
            public Type[] getActualTypeArguments() {
                return new Type[]{cls};
            }

            @NonNull
            @Override
            public Type getRawType() {
                return DataTable.class;
            }

            @Override
            public Type getOwnerType() {
                return null;
            }
        };
    }

    /**
     * 将json字符串解析为DataTable对象
     */
    @Nullable
    public static <T> DataTable<T> fromJson(@Nullable String json, @NonNull Class<T> cls) {
        //json为null、""(空字符串)、" "(空格或tab)时Gson解析都会返回null(不报异常),所以此处可不进行判空。
        try {
            if (json == null || json.isEmpty()) {
                //判断字符串是否合法
                return null;
            }
            Gson gson = new Gson();
            Type type = getType(cls);
            DataTable<T> dataTable = gson.fromJson(json, type);
            if (json.contains("NoneRow") && dataTable != null && dataTable.Table != null) {
                //判断是否存在空行标识。
                dataTable.Table.clear();
            }
            return dataTable;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将json字符串解析为ArrayList
     */
    @NonNull
    public static <T> ArrayList<T> fromJsonToList(@Nullable String json, @NonNull Class<T> cls) {
        //json为null、""(空字符串)、" "(空格或tab)时Gson解析都会返回null(不报异常),所以此处可不进行判空。
        try {
            if (json == null || json.isEmpty() || json.contains("NoneRow")) {
                //判断字符串是否合法以及是否存在空行标识。
                return new ArrayList<>();
            }
            Gson gson = new Gson();
            Type type = getType(cls);
            DataTable<T> dataTable = gson.fromJson(json, type);
            if (dataTable == null || dataTable.Table == null) {
                return new ArrayList<>();
            } else {
                return dataTable.Table;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    /**
     * 将JsonElement解析为DataTable对象
     */
    @Nullable
    static <T> DataTable<T> fromJson(@Nullable JsonElement element, @NonNull Class<T> cls) {
        try {
            if (element == null || element.isJsonNull()) {
                //判断字符串是否合法
                return null;
            }
            Gson gson = new Gson();
            Type type = getType(cls);
            DataTable<T> dataTable = gson.fromJson(element, type);
            if (element.toString().contains("NoneRow") && dataTable != null && dataTable.Table != null) {
                //判断是否存在空行标识。
                dataTable.Table.clear();
            }
            return dataTable;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将JsonElement解析为ArrayList
     */
    @NonNull
    static <T> ArrayList<T> fromJsonToList(@Nullable JsonElement element, @NonNull Class<T> cls) {
        try {
            if (element == null || element.isJsonNull() || element.toString().contains("NoneRow")) {
                //判断字符串是否合法以及是否存在空行标识。
                return new ArrayList<>();
            }
            Gson gson = new Gson();
            Type type = getType(cls);
            DataTable<T> dataTable = gson.fromJson(element, type);
            if (dataTable == null || dataTable.Table == null) {
                return new ArrayList<>();
            } else {
                return dataTable.Table;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }
}

二、解析DataSet类型的Json数据

DataSet类型的Json数据示例如下:

[{"TableName":"dt","Table":[{"FIRST_PHONE":"17333672366","USER_ID":"1674","USER_NAME":"姓名","PRODUCE_GROUP_ID":"1","PRODUCE_GROUP_NAME":"生产管理组"}]},{"TableName":"dt1","Table":[{"NUM":"1","BASIC_PROCESS_ID":"75","MACHINE_INSTANCE_ID":"21766","ACTUAL_HOUR":"0.140400","STANDARD_HOUR":"35.40","START_TIME":"2019-03-11 18:39","END_TIME":"2019-03-11 18:39","BP_NAME":"检验员用球杆仪检测","TEST_CODE":"L20170915","MODEL_NAME":"JDPMS16E_A8(16169)","POSITION":"清理车间:598","IS_SCHEDU":"否"},{"NUM":"2","BASIC_PROCESS_ID":"1196","MACHINE_INSTANCE_ID":"66936","ACTUAL_HOUR":"0.000000","STANDARD_HOUR":"3.60","START_TIME":"2020-11-21 09:29","END_TIME":"","BP_NAME":"组装联轴节","TEST_CODE":"100","MODEL_NAME":"JDWGM800_A10","POSITION":"移位入库至机械主机库仓位","IS_SCHEDU":"否"}]}]

DataSet类型的数据就是多个DataTable类型的集合,对应的Json数据解析如下:

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.util.ArrayList;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**
 * Description: 用于Json格式字符串数据传输的DataSet类型。
 * Copyright  : Copyright (c) 2020
 * Author     : mliuxb
 * Date       : 2021-03-11 09:16
 */
public class DataSet {
    //private static final String TAG = "DataSet";

    //表集合
    //private ArrayList<DataTable<?>> tables = new ArrayList<>();
    private final JsonArray mJsonSet;

    /**
     * 构造函数
     * @param dataSetJson DataSet格式的Json字符串
     */
    public DataSet(@NonNull String dataSetJson) {
        final JsonElement setElement = new JsonParser().parse(dataSetJson);
        if (setElement != null && setElement.isJsonArray()) {
            mJsonSet = setElement.getAsJsonArray();
        } else {
            mJsonSet = null;
        }
    }

    @NonNull
    public <T> ArrayList<T> fromJsonToList(@Nullable String tableName, @NonNull Class<T> cls) {
        if (mJsonSet == null || tableName == null) {
            return new ArrayList<>();
        }
        for (final JsonElement tableElement : mJsonSet) {
            final JsonObject jsonTable = tableElement.getAsJsonObject();
            String strTableName = jsonTable.getAsJsonPrimitive("TableName").getAsString();
            if (tableName.equals(strTableName)) {
                return DataTable.fromJsonToList(jsonTable, cls);
            }
        }
        //无对应的tableName时,返回空集合
        return new ArrayList<>();
    }
}

三、分页的Json数据

分页的Json数据就是对DataTable又包装了一层,示例如下:

对应的Json数据解析如下:

import com.google.gson.Gson;

import java.util.ArrayList;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import jdlf_scgl_zp_android.s005_service.wcf.DataTable;

/**
 * Description: PageDataSource
 * Copyright  : Copyright (c) 2020
 * Author     : mliuxb
 * Date       : 2021/03/11 10:47
 */
public class PageDataSource {

    private int TotalCount;
    private int pageCount;
    private String Table;

    @NonNull
    public static <T> ArrayList<T> fromJson(@Nullable String strJson, Class<T> classType) {
        try {
            Gson gsn = new Gson();
            //strJson为null、""(空字符串)、" "(空格或tab)时Gson解析都会返回null(不报异常),所以此处可不进行判空。
            PageDataSource pds = gsn.fromJson(strJson, PageDataSource.class);
            if (pds == null) {
                return new ArrayList<>();
            } else {
                return DataTable.fromJsonToList(pds.Table, classType);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/beita08/article/details/114651414