`
bantouyan
  • 浏览: 147300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解析Json——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);   
        //list.add(new Timer());   
        JsonArray jary = null;   
        try  
        {   
            jary = Json.parseJavaCollection(list);   
        }    
        catch (JsonException e)   
        {   
            System.out.println(e.getMessage());   
        }   
    }   
}   
//(第一行注释)输出:Java colloection is referenced again.   
//(第二行注释)输出:Cannot parse value: java.util.Timer@60aeb0 to json instance.

      例子中的ArrayList经过解析后将得到一个空的JsonArray实例。如果把代码中的第一行注释去掉,那么将抛出由循环引用导致的异常,如果把第二行注释去掉,那么将抛出由无法解析导致的异常。

 

 

四、parseJavaMap

      parseJavaMap与parseJavaCollection相似,只是把一个Java Map对象解析成JsonObject实例,同样要求Map对象内部没有循环引用并且所有的元素都能解析,否则会抛出JsonException异常。示例代码如下:

import java.util.*; 
import com.bantouyan.json.*;   
  
public class TestBtyJson   
{   
    public static void main(String[] args)   
    {   
        HashMap<Object, Object> map = new HashMap<Object, Object>();   
        //map.put("self", map);   
        //map.put("a", new Timer());   
        JsonObject jobj = null;   
        try  
        {   
            jobj = Json.parseJavaMap(map);   
        }    
        catch (JsonException e)   
        {   
            System.out.println(e.getMessage());   
        }   
    }   
}   
//(第一行注释)输出:Java map is referenced again.   
//(第二行注释)输出:Cannot parse value: java.util.Timer@60aeb0 to json instance.

      这个例子与上一个类似,map对象解析后得到一个空的JsonObject实例,如果把代码中的第一行注释去掉,那么将抛出由循环引用导致的异常,如果把第二行注释去掉,那么将抛出由无法解析导致的异常。


五、JsonParser

      默认情况下,parseJavaCollection与parseJavaMap只能处理一些简单的类型,如String、Number、Boolean等,如果要处理普通的Java类,就要为这些类实现Jsonable接口。但是这有局限性,例如我们要处理的类不是我们自己编写的而是来自其他包,这时候再使用Jsonable就很不方便。为了解决这种不便,bantouyan-json库还提供了另外一个接口JsonParser,该接口用在parseJavaCollection与parseJavaMap的重载版本parseJavaCollection(Collection, Jsonparser)与parseJavaMap(Map, Jsonparser)中。

      Jsonparser有四个方法,canToName用于判断Java对象是否可以转换为JsonObject子元素的Name,changToName用于将Java对象转换为JsonObject子元素的Name,canToJson用于判断Java对象是否可以转换为Json实例,changeToJson用于将Java对象转换为Json实例。需要注意的是,只有通过canToJson(canToName)的Java对象,即返回true,才会在parseJavaCollection(Collection, Jsonparser)与parseJavaMap(Map, Jsonparser)中用changeToJson(changeToName)处理,如果通不过,即返回false,则按默认规则处理。

      下面是一个例子:

import com.bantouyan.json.*;

public class StringParser implements JsonParser
{
    public boolean canToName(Object obj)
    {
        if(obj instanceof String)
            return ((String)obj).startsWith("*");
        else
            return false;
    }

    public String changeToName(Object obj) throws JsonException
    {
        String str = (String)obj;
        return "Name_" + str.substring(1);
    }
    
    public boolean canToJson(Object obj)
    {
        if(obj instanceof String)
            return ((String)obj).startsWith("#");
        else
            return false;
    }

    public Json changeToJson(Object obj) throws JsonException
    {
        String str = (String)obj;
        return new JsonPrimitive("Value_" + str.substring(1));
    }
}

 

import java.util.*;
import com.bantouyan.json.*;

public class TestBtyJson
{
    public static void main(String[] args)
    {
        HashMap<Object, Object> map = new HashMap<Object, Object>();
        map.put("na", "#va");
        map.put("*b", "vb");
        ArrayList<Object> list = new ArrayList<Object>();
        list.add("eA");
        list.add("#eb");
        list.add(map);
        
        JsonParser parser = new StringParser();
        JsonArray jaryA = Json.parseJavaCollection(list);
        System.out.println(jaryA);
        JsonArray jaryB = Json.parseJavaCollection(list, parser);
        System.out.println(jaryB);
    }
}
//输出:["eA","#eb",{"*b":"vb","na":"#va"}]
//输出:["eA","Value_eb",{"Name_b":"vb","na":"Value_va"}]

 

      例子中的JsonParse对于以*开头的Name,会转换为以Name_开头, 对于以#开头的Value,会转换为以Value_开头的字符串型Json实例。

 

 

 

 

 

相关阅读:

 

解析Json——bantouyan-json库概述

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

解析Json——Json类的实例方法

解析Json——操纵JsonObject

解析Json——操纵JsonArray

 

 

 

0
5
分享到:
评论

相关推荐

    解析Json工具.zip

    接着,可以使用提供的静态方法,如JsonConvert类的SerializeObject和DeserializeObject,来实现JSON数据的序列化和反序列化。 总之,"解析Json工具.zip"中的两个库——Newtonsoft.Json.dll和LitJson.dll,为Unity...

    PHP缓存与静态化——PHP缓存与静态化

    缓存的数据格式通常选择简单、高效的形式,如JSON或XML,以加速读取和解析。缓存可以显著提升服务器响应速度,减轻CPU负荷。 **22.2.2 缓存机制的应用** Memcached是广泛使用的分布式内存对象缓存系统,适用于动态...

    一个简单的JSON 数据格式转换类

    `JsonUtil.java`很可能是这个转换功能的工具类,包含静态方法,比如`parseJson(String jsonStr)`和`toJson(Object obj)`。这些方法将处理上述的解析和生成过程,对外提供简洁的API。 6. **异常处理**: 在处理...

    mybatis中操作json类型数据(csdn)————程序.pdf

    类中有一个静态的`ObjectMapper`实例,这是Jackson库的主要组件,用于读取和写入JSON。`objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)`配置表示在反序列化时遇到未知属性时...

    c++中的json库官方版本

    3. **解析JSON文本**:使用Json::Reader创建一个解析器对象,然后调用其`parse()`方法,传入JSON字符串和错误处理回调函数。 4. **操作Json::Value**:解析后的Json::Value对象可以被遍历、修改或添加新的元素。...

    非常高效的json库,C++编写,windows,linux都可用

    - **解析JSON**:通过`parse`函数将JSON字符串转化为JSON对象,例如`Json::Value value = Json::parse(jsonString);` - **访问数据**:使用`get`或`[]`操作符获取键对应的值,如`std::string name = value["name"]...

    java解析json方法总结

    FastJson的核心API在com.alibaba.fastjson.JSON类中,它提供了一系列静态方法来完成JSON的序列化和反序列化操作。以下是常用方法的说明: 1. parse(String text): 把JSON文本解析为JSONObject或者JSONArray对象。 2...

    java转json工具类说明文档.docx

    JsonUtils类是本文档重点介绍的工具类,它提供了一系列静态方法,能方便地处理各种类型的Java对象并将其转换为JSON格式。以下是JsonUtils类的主要方法及其功能: 1. `objectToJson(Object obj)`:这是核心方法,...

    <<项目架构那点儿事>>——工具类,你喜欢你就拿去

    首先,工具类(Utility Class)是一类专门为其他类提供静态方法的类,它们不持有任何状态(即没有实例变量),并且通常不允许被实例化。工具类的设计旨在封装常见操作,减少代码重复,提高代码复用性。例如,Java中...

    http请求工具类HttpClientUtil,get,post请求(csdn)————程序.pdf

    ` 提供了 `Lists` 类,它是 Guava 库的一部分,提供了一些静态工厂方法,用于创建和操作 List 实例,方便构建参数列表。 总结,HttpClientUtil 是一个方便的工具类,封装了 Apache HttpClient 库,简化了 HTTP 请求...

    基于JSON数据HTML5视频播放器js插件

    这种做法的核心理念是将视频文件分解成一系列静态图片帧,这些图片帧通过JSON数据进行描述和传输。在移动设备上,用户可以以低数据消耗的方式查看和播放这些图片帧,从而实现类似视频的体验。 JSON(JavaScript ...

    listjson源码0.18.0(5积分)

    1. **JsonMapper**:这是 LitJSON 的核心类,它提供了静态方法来实现JSON与.NET对象的转换。例如,`ToJson()`方法可以将.NET对象转换为JSON字符串,而`ToObject()`则能将JSON字符串转化为指定类型的.NET对象。这种...

    rapidjson解析下载

    // 解析JSON字符串 std::string jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; rapidjson::Document doc; doc.Parse(jsonString.c_str()); // 访问JSON对象 if (doc.IsObject()) { ...

    json-arduino:用于 Arduino 设备的轻量级 JSON 解析器

    Arduino 的极简 JSON 解析器 由 Laurence A. Lee ( ) 从以下原始来源而成: jsmn - JSON 词法扫描器和标记器( ) jsmn-example - Jsmn 的 JSON 解析器示例( ) 这个库旨在是一个轻量级替代 ,专门用于存储受限...

    ASP实例开发源码——淡蓝色 asp 电影爬虫后台伪静态版 v4.2.zip

    这种爬虫通常基于HTTP协议,通过模拟浏览器行为向目标网站发送请求,获取响应内容后,利用正则表达式或特定库(如Python的BeautifulSoup)解析HTML或JSON等格式的数据。 【伪静态技术】 伪静态技术是一种将动态...

    在vue中读取本地Json文件的方法

    当请求成功时,`then`回调会被调用,其中`res`对象包含了响应信息,我们可以通过`res.body`获取到JSON解析后的数据。如果请求失败,`catch`块中的`err`将包含错误信息。 4. **注意事项**: - JSON文件必须放在项目...

    html parser 应用ie的内置parser可以解析动态脚本html

    4. 输出链接:将解析到的链接以某种格式(如文本或JSON)输出,供后续程序使用。 具体实现步骤可能包括以下几个部分: 1. 引入MSHTML库:在C++项目中,我们需要引入MSHTML库的相关头文件和库文件,比如`mshtml.h`...

    busirules:一个应用程序,用于根据 JSON 中的一组静态业务规则测试用户输入

    《基于JSON的业务规则验证——深入理解busirules应用》 在现代软件开发中,业务逻辑的复杂性日益增加,为了有效地处理这些规则并确保用户输入的合法性,开发者需要高效且灵活的工具。"busirules"正是这样一个应用...

    javaBean.rar

    例如,它可能有一个静态方法`jsonToJavaBean(String jsonString, Class&lt;T&gt; beanClass)`,这个方法接受一个JSON字符串和目标JavaBean的Class类型,然后使用反射创建并填充JavaBean实例。 5. **优化代码量** 使用...

    fastjson1.2.75.jar包

    3. `JSON.parse() / JSON.parseObject() / JSON.parseArray()`: 静态方法提供更灵活的反序列化选项,可以解析到基本类型、Map、List等。 四、高级特性 1. `JSONPath`: Fastjson支持JSONPath表达式,用于在JSON对象...

Global site tag (gtag.js) - Google Analytics