`

处理JSON的Java API(转)

阅读更多

一,JSON简介。

        JSON(JavaScript Object Notation)是一种轻量级的、基于文本的、完全独立于语言的数据交换格式。它非常方便人们和机器的阅读与书写。JSON有两种结构类型的表现方式:对象和数组。对象是名/值对的无序集合。数组是值(value)的有序集合。值的类型可以是字符串(在双引号中)、数字(整数或浮点数)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null。

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": 10021
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567" 
        }
    ] 
}

        JSON通常被用在Ajax应用、配置、数据库和restful web services。几乎所有流行的网站都提供了JSON的数据交换方式在他们的restful web services上。

 

二,处理JSON。

        处理JSON的Java API(JSR 353)提供了各种便捷的API,其中包括解析、生成、转换和使用对象模型或流来查询JSON。

        对象模型的API在内存中产生一个随机存取的树状结构来代表了JSON数据。这个树可以被操作和查询。这种编程模型可以很灵活地处理需要随机存取完整内容的树。但是,对象模型通常都没有流模型效率高,而且需要的存储空间也比流模型多。

        流API提供了一种以流来解析和生成JSON的方法。它把解析生成JSON的控制权交给了程序员。流API提供了一种基于事件的解析器并且允许开发者询问下一个事件,而不是在一个回调函数中负责事件的处理。它给予了开发者更多的处理JSON的过程控制。应用程序代码可以处理或抛弃解析器事件,也可以询问下一个事件(pull the event)。流模型适合于部分不需要的数据的随机存取的局部处理。同样的,流API提供了一种通过写一次事件生成结构良好的JSON流。

 

三,对象模型API。

        对象模型API和文件对象模型(DOM)API在XML中很相似。这是一个高级的API,它为JSON对象和数组结构提供了不可变的对象模型。这些JSON结构通过使用JsonObject和JsonArray被表示为对象模型。表格1中展示了对象模型API的主要的类和接口。(JsonObject提供了一个Map视图去存取含有名/值对的无序集合;同样的,JsonArray提供了一个List去存取含有值的有序序列!)

表格 1.对象模型API中主要的类和接口

类和接口 描述
Json 包含产生JSON readers,writers,builders,和他们的工厂对象的静态方法
JsonGenerator 一次一个值的将JSON数据写入一个流中。
JsonReader 从流中读取JSON数据,并且创建一个对象模型在内存中
JsonObjectBuilder
JsonArrayBuilder
在内存中通过向源码中加入一个值,创建一个对象模型或者数组模型
JsonWriter 从内存中拿出一个对象模型写入流中
JsonValue
JsonObject
JsonArray
JsonString
JsonNumber
表示JSON数据中的数据类型.

        JsonObject,JsonArray,JsonString和JsonNumber是JsonValue的子类型。它们是被定义在API中的常量,有null,true,false的JSON值。

        对象模型API使用建造者设计模式,从头创建这些对象模型。应用程序代码可以使用接口JsonObjectBuilder来创建模型来代表JSON对象。由此产生的模型是JsonObject。应用程序代码可以使用接口JsonArrayBuilder来创建模型来代表JSON数组。由此产生的模型是JsonArray。

        这些对象模型也可以从一个输入源(例如InputStream或Reader)使用接口JsonReader来创建。同样的,可以写出到一个输出源(例如OutputStream或Writer)使用类JsonWriter。

{
    "data" : [
        { "from" : { "name" : "xxx", ... }, "message" : "yyy", ... },
        { "from" : { "name" : "ppp", ... }, "message" : "qqq", ... },
        ...
    ],
    ...
}

        举个例子,让我们使用对象模型API写个搜索Facebook的公开岗位的代码。以上是Facebook的API给我们的搜索结果:

URL url = new URL("https://graph.facebook.com/search?q=java&type=post");
try (InputStream is = url.openStream();
     JsonReader rdr = Json.createReader(is)) {
    JsonObject obj = rdr.readObject();
    JsonArray results = obj.getJsonArray("data");
    for (JsonObject result : results.getValuesAs(JsonObject.class)) {
        System.out.print(result.getJsonObject("from").getString("name"));
        System.out.print(": ");
        System.out.println(result.getString("message", ""));
        System.out.println("-----------");
    }
}

        我们可以使用对象模型API取得关于JAVA的名字和他们的岗位——在上述代码中(JsonReader和其他API上的对象可以用于带有资源的try语法中,这也叫做自动资源管理ARM!),

        +第3行创建了JsonReader,

        +第5行创建了返回结果的JsonObject,

        +第7行循环每一个结果,

        +第8-11行取得了公布人的姓名和职位,并且打印他们。

 

四,流API。

        流API与XML的流API(StAX)类似,它是由接口JsonParser和JsonGenerator组成。JsonParser包含使用流模型解析JSON数据的方法,JsonGenerator包含输出JSON数据到一个输出源的方法。表格2展示了流API中主要的类和接口。

表格 2. 流API中主要的类

类或接口 描述
Json 包含创建JSON解析器,生成器,和工厂对象的静态方法。
JsonParser 表示一个基于事件的解析器,可以从流中读取JSON数据。
JsonGenerator 每次一个值将JSON数据写出到流中

        JsonParser提供了先锋,使用pull解析对象模型,访问只读的JSON数据。在这个模型中,应用程序代码在解析器接口中,控制线程和方法调用,来使解析器向前移动或者从当前解析器的状态获得JSON数据。

        JsonGenerator提供了将JSON数据写入流的方法。生成器可以在JSON对象中写入名/值对,在JSON数组中写入值。

        流API是一个低级的API,它被设计用来更效率地处理大量的JSON数据。其他的JSON框架(例如JSON binding)通过使用API可以继承。

URL url = new URL("https://graph.facebook.com/search?q=java&type=post");
try (InputStream is = url.openStream();
     JsonParser parser = Json.createParser(is)) {
    while (parser.hasNext()) {
        Event e = parser.next();
        if (e == Event.KEY_NAME) {
            switch (parser.getString()) {
                case "name":
                    parser.next();
                   System.out.print(parser.getString());
                   System.out.print(": ");
                   break;
               case "message":
                   parser.next();
                   System.out.println(parser.getString());
                   System.out.println("---------");
                   break;
            }
        }
    }
}

        让我们使用流API来做一下刚才使用对象模型API做过的事情——在上述代码中,

        +第1-3行创建了一个流的解析器,

        +第4-5行取得了下一个事件,

        +第6行寻找KEY_NAME这个事件,

        +第8-11行读取名字并打印它们,

        +第14-16行读取职位并输出它们。(流API提供了一种有效的方式存取名字和职位!)

 

五,结论。

        处理JSON的Java API提供了如下功能——将输入流解析为不可变的对象或事件流

        +将事件流或不可变对象写入输出流中

        +编程操作不可变对象

        +使用builders编程构建不可变对象

        (构建数据绑定,转换,查询或其他的操作API基础。JAX-RS 2.0提供了原始整合为处理JSON的JAVA API)

分享到:
评论

相关推荐

    java json api,json api

    Java JSON API是Java平台上的库,提供了处理JSON的能力,包括解析JSON字符串、生成JSON对象以及进行JSON与Java对象之间的转换。 在Java中,有多种实现JSON API的库,如Jackson、Gson、org.json和json-lib等。本篇...

    JAVA-JSON工具转换类

    它可以方便地将一种类型的数据转换成另一种类型,比如将字符串转成整数,日期转成字符串等,这对于JSON数据处理的灵活性至关重要。 `JsonUtil.java`看起来是一个自定义的工具类,很可能包含了对`json-lib`和`...

    json -api 下载

    2. **JSONAPI规范**:理解资源、嵌套资源、包含关系、分页、错误处理、过滤、排序、限制和链接等核心概念。 3. **HTTP方法**:GET用于获取资源,POST用于创建新资源,PUT或PATCH用于更新资源,DELETE用于删除资源。...

    Java bean转换为Json Schema

    Java Bean转换为Json Schema是一种常见的数据转换操作,特别是在开发基于RESTful API的Web服务时,因为JSON Schema提供了数据验证和文档化的功能。Java Bean是Java编程中的一个概念,它是一类具有特定规则的POJO...

    Json_api.rar_JSON api chm_java chm_json Api_json-api chm_org.js

    综上所述,这个文档集涵盖了JSON API的原理和使用,以及Java中`org.json`库的详细操作,对于理解和实施JSON API以及在Java项目中处理JSON数据具有很高的参考价值。开发者可以借助这些CHM文件深入学习,提升自己的...

    org.json java处理json数据

    由于其简洁的API和良好的性能,`org.json`成为了Java开发者处理JSON数据的首选工具之一。在处理JSON数据时,应确保数据格式的正确性,避免出现JSONException,同时充分利用库提供的异常处理机制来确保程序的健壮性。

    java-json-api

    json解析,初学者学习json查询手册

    JSON与JAVA数据的转换

    - 数据类型匹配:Java中的数据类型与JSON的类型不一定完全对应,如Java的日期在JSON中通常表示为字符串,需要额外处理。 - JSON的嵌套结构:如果Java对象包含嵌套的对象或数组,转换时要确保这些结构能在JSON中正确...

    很好用的JAVA类转JSON工具:FastJSON (2).pdf

    FastJSON是阿里巴巴开发的一款高性能的Java JSON库,它提供了快速且便捷的方式来处理JSON数据。FastJSON不仅支持将Java对象转换为JSON字符串,还能将JSON字符串反序列化为Java对象,极大地简化了Java与JSON之间的...

    java与json的API使用

    Java与JSON的API使用是开发过程中常见的数据交互方式。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们通常使用Jackson、Gson、org....

    JSON转java类

    总的来说,这个"JSON转Java类"的工具提供了一个快速、便捷的方式来处理JSON到Java对象的转换,尤其适用于ESB(企业服务总线)等集成场景,减少了开发者手动编码的负担。无论是在小型项目还是大型系统中,这样的工具...

    json格式转换为java实体类,idea导入即可

    在Java开发中,我们经常需要将JSON字符串转换为Java实体类,以便于操作和处理这些数据。 本资源提供了一种方便快捷的方法,通过IDEA(IntelliJ IDEA)工具,可以直接将JSON格式的数据转换为对应的Java实体类。IDEA...

    java处理JSON数据

    在Java编程语言中,处理JSON(JavaScript Object Notation)数据是一项常见的任务,因为JSON作为一种轻量级的数据交换格式,广泛用于API交互、存储和传输数据。本教程将深入探讨Java中处理JSON数据的方法,包括解析...

    使用json-lib将java对象转换成json字符串

    1. **JSON与Java对象的互转**: - JSON对象可以映射为Java对象,如HashMap、ArrayList等。JSON字符串到Java对象的转换通常通过反序列化实现,而Java对象到JSON字符串的转换则称为序列化。 - json-lib库提供了一套...

    orgjson-api

    在 Java 开发中,`org.json` API 提供了一套简洁的接口和类,使得开发者可以方便地处理 JSON 数据。 这个库的核心类主要包括以下几个: 1. **JSONObject**:代表 JSON 对象,它可以包含键值对。键总是字符串,而值...

    (Java)json和String互转必备Jar包

    总的来说,这个"(Java)json和String互转必备Jar包"为Java开发者提供了一个便捷的工具,使他们能够在项目中方便地处理JSON数据,无论是从网络获取,还是在本地存储和处理。掌握好这些库的使用,对于提升开发效率和...

    处理json需要的java包

    处理JSON在Java中通常需要依赖一些库,这些库提供了方便的API来操作JSON对象。在你提供的文件列表中,包含了几个与处理JSON相关的Java库,让我们逐一了解它们的功能和用途: 1. **commons-collections-3.2.jar**:...

    java调用json参数的webservice

    综上所述,通过Java调用带有JSON参数的WebService,涉及到了Java编程语言的使用、JSON数据格式的处理以及WebService通信机制。开发者需要掌握这些技术来实现不同类型的应用程序之间的互操作性和数据交换。

    JAVA中用到的json包

    JSON包在Java中扮演着至关重要的角色,因为它允许开发者在Java对象与JSON字符串之间进行无缝转换,这对于网络通信、数据存储以及API交互等方面非常有用。 1. **JSON对象与Java对象的转换** - `JSONObject` 类是...

    java实现http请求以及解析json与java对象转换 项目源代码实例

    在Java编程中,HTTP请求和JSON处理是两个非常重要的概念,广泛应用于Web服务的开发、数据交换和API接口调用。本项目实例提供了完整的源代码,帮助开发者理解并实践这两个主题。 首先,让我们深入理解HTTP请求。HTTP...

Global site tag (gtag.js) - Google Analytics