[Android]【安卓】Json数据的快速拼装和解析

[Android]【安卓】Json数据的快速拼装和解析

本篇博客已收录到我的安卓开发小结中——点击【安卓开发小结】

参考资料:介绍 Json

一、什么是Json数据
  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
    JSON建构于两种结构:
    a、“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
    b、值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
1、结构a——对象
  • 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
    这里写图片描述
2、结构b——数组
  • 数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
    这里写图片描述
3、详解
  • 值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。
    这里写图片描述
  • 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。
    这里写图片描述
    quotation mark:引号
    reverse solidus:反斜线
    solidus:斜线
    backspace:退格
    formfeed:换页
    newline:换行
    carriage return:回车
    horizontal tab:制表符
    4 hexadecimal digits:4个16进制数
    以上字符加了一个反斜杠后,表示冒号后的意思。
  • 数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
    这里写图片描述
二、如何快速拼装Json数据

假设我们的目标数据为:

{
    "limit": 3,
    "offset": 0,
    "query": {
        "_id": {
            "$in": ["轮播位id1", "轮播位id2", "轮播位id3"]
        }
    }
}
  • 大的{}是一个Json对象,所以我们创建一个json对象,limit和offset是属于json对象的最简单的键值对,所以直接用json.put()方法添加就好,query这个key对应着{},说明后面是一个对象,所以我们创建一个Json子对象subJson1,id这个key对应的也是{},也是一个对象,所以再创建一个子对象subJson2,$in对应的是[],是一个json数组,所以我们创建一个jsonArray 对象,然后将数据添加到jsonArray 数组里,接着将jsonArray 添加到subJson2里,接着将subJson2添加到subJson1里,最后将subJson1添加到json里。
                JSONObject json = new JSONObject();
                JSONObject subJson1 = new JSONObject();
                JSONObject subJson2 = new JSONObject();
                JSONArray jsonArray = new JSONArray();
                json.put("limit",carrouselIdList.size());
                json.put("offset",0);
                for(int i=0;i<carrouselIdList.size();i++){
                    jsonArray.put(i,carrouselIdList.get(i));
                }
                subJson2.put("$in",jsonArray);
                subJson1.put("_id",subJson2);
                json.put("query",subJson1);
                String data = json.toString();
三、如何快速解析Json数据
1、添加gson库依赖(需要的可以留言)

这里写图片描述
build.gradle

dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
}
2、写一个Json类
public abstract class Json {
    private static Json json;

    Json() {
    }

    public static Json get() {
        if (json == null) {
            json = new GsonImplHelp();
        }
        return json;
    }

    public abstract String toJson(Object src);

    public abstract <T> T toObject(String json, Class<T> claxx);

    public abstract <T> T toObject(byte[] bytes, Class<T> claxx);

    public abstract <T> List<T> toList(String json, Class<T> claxx);

}
3、写一个GsonImplHelp类
public class GsonImplHelp extends Json {
    private Gson gson = new Gson();

    @Override
    public String toJson(Object src) {
        return gson.toJson(src);

    }

    @Override
    public <T> T toObject(String json, Class<T> claxx) {
        return gson.fromJson(json, claxx);

    }

    @Override
    public <T> T toObject(byte[] bytes, Class<T> claxx) {
        return gson.fromJson(new String(bytes), claxx);

    }

    @Override
    public <T> List<T> toList(String json, Class<T> claxx) {
        Type type = new TypeToken<ArrayList<T>>() {
        }.getType();
        List<T> list = gson.fromJson(json, type);
        return list;


    }
}
4、使用插件快速生成解析实体Bean类
5、在请求回调中这么处理,就可以得到想要的数据
DataParseBean bean = GsonImplHelp.get().toObject(result, DataParseBean.class);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值