redoforient / EasyJson

Json,东半球最快最好用的解析组件

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用方法

  1. 在根目录build.grade中增加 maven { url 'https://www.jitpack.io' }
allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://www.jitpack.io' }
    }
}
  1. 添加引用
implementation 'com.github.sundayxcn:EasyJson:1.1.4'

组装Json

各种类型

包括 基本类型,基本类型包装对象,对象,数组,List。 举例如下: 一个个人信息的json串包含了名字,年龄,公司,朋友等信息。

public class Company {
    String name = "part";
}

public void demo{
    String[] friend = new String[]{"fanbingbing","angelbaby","gaoyuanyuan"};
    EasyJson easyTreeJson = new EasyJson();
    easyTreeJson.put("name", "sunday");
    easyTreeJson.put("age", 28);
    easyTreeJson.put("company", new Company());
    easyTreeJson.put("friend",friend);
    String json = easyTreeJson.build();
}


         

这样的代码生成的json串如下:

{
    "name":"sunday",
    "age":28,
    "company":{
        "name":"part"
    },
    "friend":[
        "fanbingbing",
        "angelbaby",
        "gaoyuanyuan"
    ]
}

层级添加

对于如上信息,可能不满足我们上传到后台的json格式。比如上面的Company 是别人的类,我们不能在Company里面添加属性,但是需求要求我们在company里面有地址信息。那么可以这么做:

easyTreeJson.put("company.address", "shanghai");

重新build之后,json串如下:

{
    "name":"sunday",
    "age":28,
    "company":{
        "name":"part",
        "address":"shanghai"
    },
    "friend":[
        "fanbingbing",
        "angelbaby",
        "gaoyuanyuan"
    ]
}

支持自动生成子层级,比如希望将address添加到company下面的childCompany中。

easyTreeJson.put("company.childCompany.address", "shanghai");

重新build之后,json串如下:

{
    "name":"sunday",
    "age":28,
    "company":{
        "name":"part",
        "childCompany":{
            "address":"shanghai"
        }
    },
    "friend":[
        "fanbingbing",
        "angelbaby",
        "gaoyuanyuan"
    ]
}

对象组合

如果只有一个对象,可以使用简单的方法如下:

json = EasyJson.from(new Company()).build();

生成Json如下:

{
    "name":"part"
}

如果需要将多个对象的属性组合在同一层级,使用方式如下:

public class Type {
    int level = 666;
    int count = 999;
}

json = EasyJson.from(new Company(),new Type()).build();

生成Json如下:

{
    "name":"part",
    "count":999,
    "level":666
}

数组添加

如果有一个json数组串,里面类型是对象,但是现在有一个需求是往每一个对象里面插入属性,那么可以这么做

        List<Product> productList = new ArrayList<>();
        productList.add(new Product());
        productList.add(new Product());
        EasyJson easyJson = new EasyJson();
        easyJson.put("data",productList);
        String json = easyJson.build();

生成的Json如下:

{
    "data":[
        {
            "age":18,
            "name":"sunday",
            "url":"http"
        },
        {
            "age":18,
            "name":"sunday",
            "url":"http"
        }
    ]
}

现在需要给每个对象增加pop属性的值,那么这样做:

        String[] vv = new String[]{"111","222"};
        easyJson.put("data.pop",vv);
        String json = easyJson.build();

最终json如下:

{
    "data":[
        {
            "age":18,
            "name":"sunday",
            "url":"http",
            "pop":"111"
        },
        {
            "age":18,
            "name":"sunday",
            "url":"http",
            "pop":"222"
        }
    ]
}

Tips: 后添加的vv数组或者list的长度一定要大于等于原json数组长度,否则数组越界访问,导致json串生成失败。

删除节点

如果不希望把一个对象中某个属性序列化,那么方法有两种

  1. 在属性前面设置transient关键字,如下代码:
public class Lover {
    public String first = "fanbingbing";
    transient public String second = "baby";
    public String fird = "haha";
}

  EasyJson easyJson = EasyJson.from(new Lover());
  json = easyJson.build();

生成的json如下:

//会忽略掉second属性
{
    "fird":"haha",
    "first":"fanbingbing"
}
  1. 使用remove去除节点,如下代码:
        EasyJson easyJson = EasyJson.from(new Lover());
        easyJson.remove("first");
        json = easyJson.build();

生成的json如下:

{
    "fird":"haha"
}

解析json

简单的获取value:

final String json = "{\"friend\":[\"haizeng\",\"娜美\"],\"name\":\"part\"}";
EasyJson easyJson = new EasyJson(json);
String name = easyJson.getString("name");
int age = easyJson.getInt("age");
List<String> strings = easyJson.getList("friend",String.class);

如果整个json对应的是一个对象,可以使用如下方式:

Company company = easyJson.toBean(Company.class);

如果一个json中的一个字段对应一个对象,使用如下方式:

Friend friend = easyJson.toBean("friend", Friend.class);

兼容

为了减少大家的切换复杂度,支持android 原生的JSONObject导入 和导出

JSONObject jsonObject = new JSONObject();
//导入
EasyJson easyJson = new EasyJson(jsonObject);
//导出
easyJson.buildJsonObject();

###高级用法

  • 支持获取单层所有的key
//获取跟节点的所有key
easyJson.getKeys()
//获取指定节点的所有key
easyJson.getKeys("node");
  • 支持多json串合并
	       String json = "{\"firstNam2e\":\"fan\",\"secondName\":\"name\"}";
        EasyJson easyJson = new EasyJson(json);
        easyJson.join("{\"param1\":\"123\",\"param2\":\"1234\",\"dou\":{\"person\":\"haha\"}}");
        //Friend friend = easyJson.toBean(Friend.class);
        String text = easyJson.build();
生成的串如下:
{
    "firstNam2e":"fan",
    "secondName":"name",
    "param1":"123",
    "param2":"1234",
    "dou":{
        "person":"haha"
    }
}
  • 支持子节点生成单独的json串 比如上面这个json串,希望拿到如下的串
{
	"person":"haha"
}

则方法如下:

				//方法一
        BaseNode node = easyJson.getNode("dou");
        String realData = node.build();
        //方法二
        String ss = easyJson.buildKey("dou");

About

Json,东半球最快最好用的解析组件

License:Apache License 2.0


Languages

Language:Java 100.0%