java的json解析工具_json在java中的几种解析工具的使用

json一般有两种结构,json的官方介绍可以参考 http://www.json.org/,这里不再赘述。java中json的解析工具有很多,如json-lib,org-json,fast-json,jackson等,这里选择几种解析工具简要说明一下它们的使用方式。

json-lib的使用

JsonObject.from(Object object)

JsonArray.from(Object object)

这两种方式可以创建json对象,前者可以传入键值对形式的字符串,map,javaBean;后者可以传入数组对象,javascript格式的数组字符串,set集合,list集合。

基本使用:

136462995_1_20180622125239925.gif

String str = "{'list':\"[{'name':'gs', 'age':20}]\"}";

JSONObject jo = JSONObject.fromObject(str);

System.out.println(jo.toString());

Object object = jo.get("list");

JSONArray ja = JSONArray.fromObject(object);

System.out.println(ja);

//{"list":"[{'name':'gs', 'age':20}]"}//[{"name":"gs","age":20}]

136462995_1_20180622125239925.gif

136462995_1_20180622125239925.gif

/*** 对象数组转json数组对象*/

@Test

public void objArr2Ja(){

Object[] o = { "北京", "上海", 89, true, 90.87 };

JSONArray json = JSONArray.fromObject(o);

System.out.println(json);//["北京","上海",89,true,90.87]

}

136462995_1_20180622125239925.gif

另外,还可以传入一个 JsonConfig参数,对于json解析做一些限制。

JsonConfig config = new JsonConfig();

config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);//防止自循环,当person对象类拥有自身类型的属性时,会循环生成json字符串,这是不允许的。

JSONObject jo = JSONObject.fromObject(person, config);

String s = "{'name':'20','age':'30'}";

JsonConfig config = new JsonConfig();

config.setExcludes(new String[]{"name"}); //排除不需要转化为json的属性,主要针对JSONObject对象

JSONObject json = JSONObject.fromObject(s,config);

System.out.println(json);

Map map = new HashMap();

map.put("name", "json");

map.put("class", "ddd");

JsonConfig config = new JsonConfig();

config.setIgnoreDefaultExcludes(true); //输出json时是否忽略 要排除的默认属性,默认值false表示不忽略,此处true表示忽略。

JSONObject jsonObject = JSONObject.fromObject(map,config);

private static final String[] DEFAULT_EXCLUDES = new String[] { "class", "declaringClass", "metaClass" }; //源码中默认会过滤的几个key

registerJsonBeanProcessor 当value类型是从java的一个bean转化过来的时候,可以提供自定义处理器

136462995_1_20180622125239925.gif

public static void testMap() {

Map map = new HashMap();

map.put("name", "json");

map.put("class", "ddd");

map.put("date", new Date());

JsonConfig config = new JsonConfig();

config.setIgnoreDefaultExcludes(false);

config.registerJsonBeanProcessor(Date.class,

new JsDateJsonBeanProcessor()); //当输出时间格式时,采用和JS兼容的格式输出

JSONObject jsonObject = JSONObject.fromObject(map, config);

System.out.println(jsonObject);

}

136462995_1_20180622125239925.gif

结果:{"date":{"year":2017,"month":0,"day":20,"hours":23,"minutes":15,"seconds":54,"milliseconds":615},"name":"json"}

对于JsonObject对象,获取键值时,建议使用JSONObject.get()方法,不要使用JSONobject.getString()等指定返回结果类型的方法;因为当键不存在或键存在但转换类型异常时,后者会直接抛异常,而键不存在时前者会直接返回一个null对象。

org-json的使用

构建json字符串

使用JSONObject的无参构造方法,然后调用put()方法,最后toString()。无序的

1

2String string =new JSONObject().put("name","gs").put("school","jinan").toString();

System.out.println(string);

使用JSONObject的有参构造方法,传入参数字符串。无序的

1

2

3String str ="{'x':'5',  j:88t,  k: 72,  y:tfj, \"z\":m}";

JSONObject jo =new JSONObject(str);

System.out.println(jo.toString());//{"x":"5","y":"tfj","j":"88t","z":"m","k":72}

jo = new JSONObject("{k:v,k2:v2,k3:[1,{k4:V4}]}");

System.out.println(jo.toString());//{"k2":"v2","k3":[1,{"k4":"V4"}],"k":"v"}

1

2JSONArray ja =new JSONArray("[{x:5,y:7,z:10}]");

System.out.println(ja.toString());//[{"x":5,"y":7,"z":10}]

String s = "{hpys=2, hpgs=0, jgsk=170118042446, cllx=H1, hphm=AV1738, carPic=http://172.16.56.204:8088/g1/M00/00/00/rBA4zFh-gS-IXyLNAACW0w5Ti0wAAAAQwNjyY8AAJbr858.jpg}";

JSONObject jo = new JSONObject(s);

System.out.println(jo); //错误的,值中不能出现特殊字符/,:

java.lang.ClassCastException: org.json.JSONObject cannot be cast to java.util.Map

String str = "{x=5,y=7,z=10}";

JSONObject jo = new JSONObject(str);

Map map = (Map)jo;

使用JSONStringer()类

String string2 = new JSONStringer().object().key("name").value("gs").key("school").value("jinna").endObject().toString();

其实,json-lib中也有类似的两个方法。

而且,使用中发现通过JSONObject构造的json文本顺序混乱,但是JSONStringer却是有序的。

2. 获取Json对象的键值对

方法与json-lib相似,都有get(),getInt()等方法,但是如果键不存在,使用get()方法或getXXX()方法都会抛出异常,这是与json-lib截然不同的,使用者需要格外注意。其他方面大致相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值