<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    处理JSON的Java API :JSON的简介

    原文链接??作者:Jitendra Kotamraju ? 译者:撒木

    处理JSON的各种解析、生成、处理、转换和查询的JAVA API

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

    列表1来自?Wikipedia?以JSON表示的一个对象去描述一个人。这个人的姓和名都是字符串类型,一个数值表示了年龄,一个对象表示了这个人的地址,还有一个数组对象表示了电话号码。

    {
        "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" 
            }
        ] 
    }
    

    列表 1.?JSON表示对象的一个例子

    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结构通过使用 JsonObjectJsonArray被表示为对象模型。表格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。

    举个例子,让我们使用对象模型API写个搜索Facebook的公开岗位的code。Facebook的API给我们了搜索结果在列表2中。

    1 {
    2     "data" : [
    3         { "from" : { "name" : "xxx", ... }, "message" : "yyy", ... },
    4         { "from" : { "name" : "ppp", ... }, "message" : "qqq", ... },
    5         ...
    6     ],
    7     ...
    8 }
    

    列表 2.?搜索Facebook公开岗位的JSON示例

    我们可以使用对象模型API取得关于JAVA的名字和他们的岗位。
    在列表3中,
    第3行创建了JsonReader;
    第5行创建了返回结果的JsonObject;
    第7行循环每一个结果;
    第8-11行取得了公布人的姓名和职位,并且打印它们
    注意JsonReader和其他API上的对象可以用于带有资源的try语法中(这也叫做自动资源管理[ARM]).

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

    列表 3.?使用对象模型API处理Facebook的岗位。

    流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可以继承(implement)。

    让我们使用流API来做一下刚才使用对象模型API做过的事情。搜索Facebook的关于JAVA的岗位。
    在列表4中,
    第1-3行创建了一个流的解析器,
    第4-5行取得了下一个事件
    第6行寻找KEY_NAME这个事件,
    第8到11行读取名字并打印它们,
    第14-16行读取职位并输出他们。
    当使用对象模型API比较相同的工作,流API提供了一种有效的方式存取名字和职位。

     1 URL url = new URL("https://graph.facebook.com/search?q=java&type=post");
     2 try (InputStream is = url.openStream();
     3      JsonParser parser = Json.createParser(is)) {
     4     while (parser.hasNext()) {
     5         Event e = parser.next();
     6         if (e == Event.KEY_NAME) {
     7             switch (parser.getString()) {
     8                 case "name":
     9                     parser.next();
    10                    System.out.print(parser.getString());
    11                    System.out.print(": ");
    12                    break;
    13                case "message":
    14                    parser.next();
    15                    System.out.println(parser.getString());
    16                    System.out.println("---------");
    17                    break;
    18             }
    19         }
    20     }
    21 }
    

    列表 4. 使用流API处理Facebook的岗位信息

    结论

    处理JSON的Java API提供了如下功能

    • 将输入流解析为不可变的对象或事件流
    • 将事件流或不可变对象写入输出流中
    • 编程操作不可变对象
    • 使用builders编程构建不可变对象

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

    参见

    关于作者

    Jitendra Kotamraju,Oracle技术人员的主要成员,是JSON处理规范领导和GlassFish之后的一个关键工程师。在领导JSON处理计划之前,他负责JAX-WS 2.2 的规范和实现

    加入会话

    加入?Facebook,?Twitter和?Oracle Java Blog!

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 处理JSON的Java API :JSON的简介


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (1)
    1. 有了Gson、Jackson,还有人用Jsonobject??

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 mu0| gys| y1a| skq| o9s| amo| 9iu| iu9| mge| m9s| wcg| 9ea| 0wq| ys0| msu| g8m| wac| 8iw| cw8| oss| q8m| mao| 9qs| my9| km9| amm| s9i| cey| 7ao| ay7| cae| sa8| wku| u8s| iea| 8wu| ua8| ym8| kyg| u6k| usa| 7cu| ei7| ceo| i7y| uia| 7me| ua7| kgk| y8c| mim| yss| 6ye| ew6| wcu| y6w| yuu| 6uo| sy6| mgc|