android解析JSON数据
JSONObject的使用
一、JSON对象的使用:
Stringcontent="{'username':'linux','password':'123456'}";
JSONObjectjsonObject=newJSONObject(content);
Stringusername=jsonObject.getString("username");
Stringpassword=jsonObject.getString("password");
二、JSON数组的使用:
StringjsonContent="[{'user':'刘力','age':21,'femal':true},"
+"{'user':'chen','age':20,'femal':false}]";
JSONArrayjsonArray=newJSONArray(jsonContent);
for(inti=0;i<jsonArray.length();i++){
JSONObjectobject=jsonArray.getJSONObject(i);
System.out.print(object.getString("user")+"");
System.out.print(object.getInt("age")+"");
System.out.print(object.getBoolean("femal")+"");
System.out.println();
}
三、JSON数组与JSON对象混合使用
StringjsonString="[{'user':'tomhu','age':21,"+"'info':{'adress':'hubai','sex':'femal'}},"
+"{'user':'chen','age':20,"+"'info':{'adress':'hunan','sex':'male'}}]";
JSONArrayjsonArrays=newJSONArray(jsonString);
for(inti=0;i<jsonArrays.length();i++){
JSONObjectobjects=jsonArrays.getJSONObject(i);
System.out.print(objects.getString("user")+"");
System.out.print(objects.getInt("age")+"");
System.out.print(objects.getJSONObject("info").getString("adress")+"");
System.out.print(objects.getJSONObject("info").getString("sex")+"");
System.out.println();
}
四、JSON数组中存储对象
Personperson=newPerson();
person.setUsername("linux");
person.setPassword("123456");
JSONArrayjsonArray=newJSONArray();
jsonArray.put(0,person);
jsonArray.put(1,"Iloveyou");
//Stringusername=jsonArray.getJSONObject(0).getString("username");错误的写法
Personuser=(Person)jsonArray.get(0);
System.out.println("username:"+user.getUsername());
JSONObject的原理
JsonObject的存储与取出
一、JSONObject里面维护了一个LinkedHashMap,当生成一个无参数的JSONObject,实质是初始化了一个Map:
privatefinalLinkedHashMap<String,Object>nameValuePairs;
publicJSONObject(){
nameValuePairs=newLinkedHashMap<String,Object>();
}
二、当JSONObject增加数据,实质上把数据的键值对方法存放在上述的Map中:
publicJSONObjectput(Stringname,booleanvalue)throwsJSONException{
nameValuePairs.put(checkName(name),value);
returnthis;
}
三、从JSONObject中取出数据,很容易想到的就是从Map取出了:
publicStringgetString(Stringname)throwsJSONException{
Objectobject=get(name);//get()方法就是执行Objectresult=nameValuePairs.get(name);
Stringresult=JSON.toString(object);
if(result==null){
throwJSON.typeMismatch(name,object,"String");
}
returnresult;
}
JsonObject的解析过程
一、JsonObject还有一个带参数的构造函数:常用的是传递一个String类型的参数
publicJSONObject(Stringjson)throwsJSONException{
this(newJSONTokener(json));
}
二、跟进去,发现主要执行的是JSONTokener的nextValue()方法,在这个方法中主要是对数据进行解析;
publicObjectnextValue()throwsJSONException{
intc=nextCleanInternal();
switch(c){
case-1:
throwsyntaxError("Endofinput");
case'{':
returnreadObject();
case'[':
returnreadArray();
case'\'':
case'"':
returnnextString((char)c);
default:
pos--;
returnreadLiteral();
}
}
在nextCleanInternal方法中,它会从头到尾的逐个字符的解析,对于一些字符做一些处理。例如空格,换行,转义符等!
当解析到[表示开始一个对象的读取,当解析到{表示一个数组的读取
三、在readObject方法中,仍然是调用nextCleanInternal()方法,逐个得到解析的字符,下到解析到}.下面贴出重要代码
intfirst=nextCleanInternal();//得到解析的字符
if(first=='}'){
returnresult;
}elseif(first!=-1){
pos--;
}
.......
while(true){
Objectname=nextValue();//解析得到键
intseparator=nextCleanInternal();
if(separator!=':'&&separator!='='){
throwsyntaxError("Expected':'after"+name);
}
if(pos<in.length()&&in.charAt(pos)=='>'){
pos++;
}
result.put((String)name,nextValue());//将解析得到的键值对,存放在map当中
switch(nextCleanInternal()){
case'}':
returnresult;
case';':
case',':
continue;
default:
throwsyntaxError("Unterminatedobject");
}
}
四、nextValue方法比较关键,它流转解析的大部分工作!在nextValue中有一个readLiteral方法,针对一些类型做处理,得到解析之后的结果:
privateObjectreadLiteral()throwsJSONException{
Stringliteral=nextToInternal("{}[]/\\:,=;#\t\f");
if(literal.length()==0){
throwsyntaxError("Expectedliteralvalue");
}elseif("null".equalsIgnoreCase(literal)){
returnJSONObject.NULL;
}elseif("true".equalsIgnoreCase(literal)){
returnBoolean.TRUE;
}elseif("false".equalsIgnoreCase(literal)){
returnBoolean.FALSE;
}
/*trytoparseasanintegraltype...*/
if(literal.indexOf('.')==-1){
intbase=10;
Stringnumber=literal;
if(number.startsWith("0x")||number.startsWith("0X")){
number=number.substring(2);
base=16;
}elseif(number.startsWith("0")&&number.length()>1){
number=number.substring(1);
base=8;
}
try{
longlongValue=Long.parseLong(number,base);
if(longValue<=Integer.MAX_VALUE&&longValue>=Integer.MIN_VALUE){
return(int)longValue;
}else{
returnlongValue;
}
}catch(NumberFormatExceptione){
/*
*Thisonlyhappensforintegralnumbersgreaterthan
*Long.MAX_VALUE,numbersinexponentialform(5e-10)and
*unquotedstrings.Fallthroughtotryfloatingpoint.
*/
}
}
/*...nexttrytoparseasafloatingpoint...*/
try{
returnDouble.valueOf(literal);
}catch(NumberFormatExceptionignored){
}
/*...finallygiveup.Wehaveanunquotedstring*/
returnnewString(literal);//anewstringavoidsleakingmemory
}
五、至于JSONArray的解析与JsonObject的解析过程是一样的,它里面维护的是一个List:
privatefinalList<Object>values;
publicJSONArray(JSONTokenerreadFrom)throwsJSONException{
Objectobject=readFrom.nextValue();
if(objectinstanceofJSONArray){
values=((JSONArray)object).values;
}else{
throwJSON.typeMismatch(object,"JSONArray");
}
}
Gson的使用
一、我们在测试当中先加入一个Person类,方便测试:
packagecom.tomhu.test;
publicclassPerson{
privateStringname;
privateintage;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
}
二、gson把对象转换成JSON格式
Gsongson=newGson();
Personperson=newPerson();
person.setName("linux");
person.setAge(23);
Stringstr=gson.toJson(person);
System.out.println(str);
打印结果: {"name":"linux","age":23}
三、gson把json格式解析成对象
StringjsonData="{'name':'刘力','age':19}";
Personperson=gson.fromJson(jsonData,Person.class);
System.out.println(person.getName()+","+person.getAge());
打印结果:刘力,19
四、gson把List对象解析成Json格式:
Gsongson=newGson();
List<Person>persons=newArrayList<Person>();
for(inti=0;i<2;i++){
Personp=newPerson();
p.setName("name"+i);
p.setAge(i*5);
persons.add(p);
}
Stringstr=gson.toJson(persons);
System.out.println(str);
打印结果:[{"name":"name0","age":0},{"name":"name1","age":5}]
五、gson把Json格式解析成List对象:
Gsongson=newGson();
Stringstr="[{'name':'linux','age':10},{'name':'huhx','age':22}]";
List<Person>ps=gson.fromJson(str,newTypeToken<List<Person>>(){}.getType());
for(inti=0;i<ps.size();i++){
Personperson=ps.get(i);
System.out.print("name:"+person.getName()+"age:"+person.getAge());
}
打印结果:name:linuxage:10name:huhxage:22