java解析json字符串数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解析json字符串数据相关的知识,希望对你有一定的参考价值。
我现在有这样一段json字符串,麻烦给个解析实例:
["name":"admin","sex":"man","name":"admin1","sex":"woman"]
这个需要导入个jar包的,自己写太麻烦,而且要考虑特殊字符的转义的。
1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能。
2. json-lib 主页 : http://json-lib.sourceforge.net/
3.执行环境
需要以下类库支持
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6
4.功能示例
这里通过JUnit-Case例子给出代码示例
package com.mai.json;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sf.ezmorph.Morpher;
import net.sf.ezmorph.MorpherRegistry;
import net.sf.ezmorph.bean.BeanMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.junit.Test;
public class JsonLibTest
/*
* 普通类型、List、Collection等都是用JSONArray解析
*
* Map、自定义类型是用JSONObject解析
* 可以将Map理解成一个对象,里面的key/value对可以理解成对象的属性/属性值
* 即key1:value1,key2,value2......
*
* 1.JSONObject是一个name:values集合,通过它的get(key)方法取得的是key后对应的value部分(字符串)
* 通过它的getJSONObject(key)可以取到一个JSONObject,--> 转换成map,
* 通过它的getJSONArray(key) 可以取到一个JSONArray ,
*
*
*/
//一般数组转换成JSON
@Test
public void testArrayToJSON()
boolean[] boolArray = new boolean[]true,false,true;
JSONArray jsonArray = JSONArray.fromObject( boolArray );
System.out.println( jsonArray );
// prints [true,false,true]
//Collection对象转换成JSON
@Test
public void testListToJSON()
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray = JSONArray.fromObject( list );
System.out.println( jsonArray );
// prints ["first","second"]
//字符串json转换成json, 根据情况是用JSONArray或JSONObject
@Test
public void testJsonStrToJSON()
JSONArray jsonArray = JSONArray.fromObject( "['json','is','easy']" );
System.out.println( jsonArray );
// prints ["json","is","easy"]
//Map转换成json, 是用jsonObject
@Test
public void testMapToJSON()
Map map = new HashMap();
map.put( "name", "json" );
map.put( "bool", Boolean.TRUE );
map.put( "int", new Integer(1) );
map.put( "arr", new String[]"a","b" );
map.put( "func", "function(i) return this.arr[i]; " );
JSONObject jsonObject = JSONObject.fromObject( map );
System.out.println( jsonObject );
//复合类型bean转成成json
@Test
public void testBeadToJSON()
MyBean bean = new MyBean();
bean.setId("001");
bean.setName("银行卡");
bean.setDate(new Date());
List cardNum = new ArrayList();
cardNum.add("农行");
cardNum.add("工行");
cardNum.add("建行");
cardNum.add(new Person("test"));
bean.setCardNum(cardNum);
JSONObject jsonObject = JSONObject.fromObject(bean);
System.out.println(jsonObject);
//普通类型的json转换成对象
@Test
public void testJSONToObject() throws Exception
String json = "name=\\"json\\",bool:true,int:1,double:2.2,func:function(a) return a; ,array:[1,2]";
JSONObject jsonObject = JSONObject.fromObject( json );
System.out.println(jsonObject);
Object bean = JSONObject.toBean( jsonObject );
assertEquals( jsonObject.get( "name" ), PropertyUtils.getProperty( bean, "name" ) );
assertEquals( jsonObject.get( "bool" ), PropertyUtils.getProperty( bean, "bool" ) );
assertEquals( jsonObject.get( "int" ), PropertyUtils.getProperty( bean, "int" ) );
assertEquals( jsonObject.get( "double" ), PropertyUtils.getProperty( bean, "double" ) );
assertEquals( jsonObject.get( "func" ), PropertyUtils.getProperty( bean, "func" ) );
System.out.println(PropertyUtils.getProperty(bean, "name"));
System.out.println(PropertyUtils.getProperty(bean, "bool"));
System.out.println(PropertyUtils.getProperty(bean, "int"));
System.out.println(PropertyUtils.getProperty(bean, "double"));
System.out.println(PropertyUtils.getProperty(bean, "func"));
System.out.println(PropertyUtils.getProperty(bean, "array"));
List arrayList = (List)JSONArray.toCollection(jsonObject.getJSONArray("array"));
for(Object object : arrayList)
System.out.println(object);
//将json解析成复合类型对象, 包含List
@Test
public void testJSONToBeanHavaList()
String json = "list:[name:'test1',name:'test2'],map:test1:name:'test1',test2:name:'test2'";
// String json = "list:[name:'test1',name:'test2']";
Map classMap = new HashMap();
classMap.put("list", Person.class);
MyBeanWithPerson diyBean = (MyBeanWithPerson)JSONObject.toBean(JSONObject.fromObject(json),MyBeanWithPerson.class , classMap);
System.out.println(diyBean);
List list = diyBean.getList();
for(Object o : list)
if(o instanceof Person)
Person p = (Person)o;
System.out.println(p.getName());
//将json解析成复合类型对象, 包含Map
@Test
public void testJSONToBeanHavaMap()
//把Map看成一个对象
String json = "list:[name:'test1',name:'test2'],map:testOne:name:'test1',testTwo:name:'test2'";
Map classMap = new HashMap();
classMap.put("list", Person.class);
classMap.put("map", Map.class);
//使用暗示,直接将json解析为指定自定义对象,其中List完全解析,Map没有完全解析
MyBeanWithPerson diyBean = (MyBeanWithPerson)JSONObject.toBean(JSONObject.fromObject(json),MyBeanWithPerson.class , classMap);
System.out.println(diyBean);
System.out.println("do the list release");
List<Person> list = diyBean.getList();
for(Person o : list)
Person p = (Person)o;
System.out.println(p.getName());
System.out.println("do the map release");
//先往注册器中注册变换器,需要用到ezmorph包中的类
MorpherRegistry morpherRegistry = JSONUtils.getMorpherRegistry();
Morpher dynaMorpher = new BeanMorpher( Person.class, morpherRegistry);
morpherRegistry.registerMorpher( dynaMorpher );
Map map = diyBean.getMap();
/*这里的map没进行类型暗示,故按默认的,里面存的为net.sf.ezmorph.bean.MorphDynaBean类型的对象*/
System.out.println(map);
/*输出:
testOne=net.sf.ezmorph.bean.MorphDynaBean@f73c1[
name=test1
], testTwo=net.sf.ezmorph.bean.MorphDynaBean@186c6b2[
name=test2
]
*/
List<Person> output = new ArrayList();
for( Iterator i = map.values().iterator(); i.hasNext(); )
//使用注册器对指定DynaBean进行对象变换
output.add( (Person)morpherRegistry.morph( Person.class, i.next() ) );
for(Person p : output)
System.out.println(p.getName());
/*输出:
test1
test2
*/
参考技术A json格式分为obj和array。你这个显然是array类型的,也就是说这个json里有两个对象分别为,里面的。解析时按照键值对的方式解析比如你返回的数据名字叫data。那就是data[0].name=admin或者data[0].sex=man. 参考技术B 网上应该有线程的吧
java怎么使用gson解析json字符串
Gson是谷歌推出的解析json数据以及将对象转换成json数据的一个开源框架. 现在json因其易读性和高效率而被广泛的使用着.
相对于java以及其它json的解析框架,Gson非常的好用.
简单来讲就是根据json的数据结构定义出相应的javabean --->"new"出Gson的实例gson---->gson.fromJson(jsonString,JavaBean.class) 即可.
下面给出一个实例来说明.
步骤1:目标:将从webservice传回的json
"status": 0,
"result":
"location":
"lng": 103.98964143811,
"lat": 30.586643130352
,
"formatted_address": "四川省成都市双流县北一街154",
"business": "簇桥,金花桥",
"addressComponent":
"city": "成都市",
"district": "双流县",
"province": "四川省",
"street": "北一街",
"street_number": "154"
,
"cityCode": 75
先普及下json数据格式定义: json数据只有两种格式.
一种是对象: 一个大括号包裹的内容就是一个对象.里面是无数个逗号相间隔的键值对
"firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa"一种是数组:一个方括号包裹的内容就是一个数组,里面是无数个逗号相间隔的json对象
如:
"people": [
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
,
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
,
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
]
步骤2 定义json数据格式对应的javaBean
private Integerstatus;
private ResultDetailresult;
public Result()
public Result(Integer status, ResultDetail result)
super();
this.status = status;
this.result = result;
public ResultDetail getResult()
return this.result;
public Integer getStatus()
return this.status;
public void setResult( ResultDetail result )
this.result = result;
public void setStatus( Integer status )
this.status = status;
@Override
public String toString()
return "Result [status=" + this.status + ", result=" + this.result
+ "]";
public class ResultDetail
Locationlocation;
Stringformatted_address;
AddressComponentaddressComponent;
Stringbusiness;
StringcityCode;
public ResultDetail()
super();
// TODO Auto-generated constructor stub
public ResultDetail(Location location, String formatted_address,
AddressComponent addressComponent, String business, String cityCode)
super();
this.location = location;
this.formatted_address = formatted_address;
this.addressComponent = addressComponent;
this.business = business;
this.cityCode = cityCode;
public AddressComponent getAddressComponent()
return this.addressComponent;
public String getBusiness()
return this.business;
public String getCityCode()
return this.cityCode;
public String getFormatted_address()
return this.formatted_address;
public Location getLocation()
return this.location;
public void setAddressComponent( AddressComponent addressComponent )
this.addressComponent = addressComponent;
public void setBusiness( String business )
this.business = business;
public void setCityCode( String cityCode )
this.cityCode = cityCode;
public void setFormatted_address( String formatted_address )
this.formatted_address = formatted_address;
public void setLocation( Location location )
this.location = location;
public class Location
Stringlng;
Stringlat;
public Location()
public Location(String lng, String lat)
this.lng = lng;
this.lat = lat;
public String getLat()
return this.lat;
public String getLng()
return this.lng;
public void setLat( String lat )
this.lat = lat;
public void setLng( String lng )
this.lng = lng;
@Override
public String toString()
return "Location [lng=" + this.lng + ", lat=" + this.lat + "]";
public class AddressComponent
Stringcity;
Stringdistrict;
Stringprovince;
Stringstreet;
Stringstreet_number;
public AddressComponent()
super();
// TODO Auto-generated constructor stub
public AddressComponent(String city, String district, String province,
String street, String street_number)
super();
this.city = city;
this.district = district;
this.province = province;
this.street = street;
this.street_number = street_number;
public String getCity()
return this.city;
public String getDistrict()
return this.district;
public String getProvince()
return this.province;
public String getStreet()
return this.street;
public String getStreet_number()
return this.street_number;
public void setCity( String city )
this.city = city;
public void setDistrict( String district )
this.district = district;
public void setProvince( String province )
this.province = province;
public void setStreet( String street )
this.street = street;
public void setStreet_number( String street_number )
this.street_number = street_number;
@Override
public String toString()
return "AddressComponent [city=" + this.city + ", district="
+ this.district + ", province=" + this.province + ", street="
+ this.street + ", street_number=" + this.street_number + "]";
测试:
jsonString ( 目标json数据,已经在最上面写好的)
Gson gson = new Gson();
Result fromJson = gson.fromJson( jsonString.toString() ,Result.class );
System.out.println( "******************************************" );
System.out.println( fromJson );
结果:
jsonString:"status":0,"result":"location":"lng":103.98964143811,"lat":30.586643130352,"formatted_address":"四川省成都市双流县北一街154","business":"簇桥,金花桥","addressComponent":"city":"成都市","district":"双流县","province":"四川省","street":"北一街","street_number":"154","cityCode":75*******************************************
Result [status=0, result=ResultDetail [location=Location [lng=103.98964143811, lat=30.586643130352], formatted_address=四川省成都市双流县北一街154, addressComponent=AddressComponent [city=成都市, district=双流县, province=四川省, street=北一街, street_number=154], business=簇桥,金花桥, cityCode=75]]
可见,jsonString已经成功的被转换成了对应的javaBean
步骤3 : 总结.说明
Gson可以很轻松的实现javaBean和jsonString之间的互转.只需要明白json如何定义.剩下的就非常简单了.
参考技术A 步骤1:目标:将从webservice传回的json1
"status": 0,
"result":
"location":
"lng": 103.98964143811,
"lat": 30.586643130352
,
"formatted_address": "四川省成都市双流县北一街154",
"business": "簇桥,金花桥",
"addressComponent":
"city": "成都市",
"district": "双流县",
"province": "四川省",
"street": "北一街",
"street_number": "154"
,
"cityCode": 75
2
先普及下json数据格式定义: json数据只有两种格式.
一种是对象: 一个大括号包裹的内容就是一个对象.里面是无数个逗号相间隔的键值对
"firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa"
一种是数组:一个方括号包裹的内容就是一个数组,里面是无数个逗号相间隔的json对象
如:
"people": [
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
,
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
,
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
]
END
步骤2 定义json数据格式对应的javaBean
public class Result
private Integer status;
private ResultDetail result;
public Result()
public Result(Integer status, ResultDetail result)
super();
this.status = status;
this.result = result;
public ResultDetail getResult()
return this.result;
public Integer getStatus()
return this.status;
public void setResult( ResultDetail result )
this.result = result;
public void setStatus( Integer status )
this.status = status;
@Override
public String toString()
return "Result [status=" + this.status + ", result=" + this.result
+ "]";
参考技术B 去官网下载jar包,调用方法。
以上是关于java解析json字符串数据的主要内容,如果未能解决你的问题,请参考以下文章