日期:2014-05-16  浏览次数:20448 次

解析Json——Json类的静态方法

????? 要使用bantouyan-json库解析Json数据,可以使用类Json。类Json是JsonArray、JsonObject和JsonPrimitive的基类,它有四个静态方法用于解析Json数据,这四个方法分别是parseJsonText、parseJsonReader、parseJavaMap、parseJavaCollection,下面依次介绍。

?

一、parseJsonText

要将一个表示Json文本的字符串解析成一个Json实例,就要调用方法Json类的静态方法parseJsonText,示例代码如下:

import com.bantouyan.json.JsonObject;   
  
public class TestBtyJson   
{   
    public static void main(String[] args)   
    {   
        String jsonText = "{a: \"AA\", b: \"BB\", c: 23, d: true, e: null}";   
        JsonObject jobj = (JsonObject)Json.parseJsonText(jsonText);   
        System.out.println(jobj.getString("b"));   
    }   
}   
//输出: BB 

?? ? ?parseJsonText返回一个Json类实例,但在实际使用过程中,我们更常使用的类是JsonArray和JsonObject,你可以用instanceof操作符或者Json类的实例方法getType来确定返回实例的类型。通常情况下,我们知道所解析的字符串内的Json文本到底是表示JsonArray还是JsonObject,即我们知道返回的Json实例的类型,所以我们可以直接使用强制类型转换。

????? 如果我们传给方法parseJsonText的文本既不能表示成一个JsonArray,也不能表示成一个JsonObject,那么这个方法将抛出一个JsonException异常。这是一个runtimeException,没有必要时可以不予捕获,如果你不能保证所解析的Json文本格式正确,那么最好捕获这个异常并加以处理。捕获异常的示例代码如下:

import com.bantouyan.json.*;   
  
public class TestBtyJson   
{   
    public static void main(String[] args)   
    {   
        String jsonText = "{a \"AA\", b: \"BB\", c: 23, d: true, e: null}";   
        JsonObject jobj = null;   
        try  
        {   
            jobj = (JsonObject)Json.parseJsonText(jsonText);   
        }    
        catch (JsonException e)   
        {   
            System.out.println(e.getMessage());   
        }   
    }   
}   
//输出: Non-blank character found at position 3 before ':'.

?? ? ?这个例子中Json Object的第一个子元素的Name与Value之间少了分隔符“:”,导致抛出异常JsonException,异常的Message解释了出现异常的原因:在“:”之前发现了非空白字符。

?

?

二、parseJsonReader

????? 如果待解析的文本来自一个Reader对象,那么可以调用Json类的静态方法parseJsonReader,这个方法除了会抛出JsonException异常外,还会抛出IOException异常。示例代码如下:

import java.io.IOException;   
import com.bantouyan.json.*;   
  
public class TestBtyJson   
{   
    public static void main(String[] args)   
    {   
        Reader reader = new ......   
        JsonObject jobj = null;   
        try  
        {   
            jobj = (JsonObject)Json.parseJsonReader(reader);   
        }     
        catch (IOException e)   
        {   
            e.printStackTrace();   
        }   
        catch (JsonException e)   
        {   
            System.out.println(e.getMessage());   
        }   
    }   
}  

?? ? ?parserJsonReader要求被解析的JsonReader内包含一个完整的Json字符串,不允许Json字符串前后有其他非空白内容,否则会抛出异常,而且,读取Reader导致的异常IOException必须在代码中予以处理。

?

?

三、parseJavaCollection

?????? 如果要将一个Java Collection对象转换为一个JsonArray实例,就要调用方法parseJavaCollection,但要保证Collection对象内部没有循环引用并且所有的子元素都能解析,否则会抛出JsonException异常。示例代码如下:

import java.util.*; 
import com.bantouyan.json.*;   
  
public class TestBtyJson   
{   
    public static void main(String[] args)   
    {   
        ArrayList<Object> list = new ArrayList<Object>();   
        //list.add(list);