1 / 33

John Clingan Java EE 和 GlassFish 产品经理 john.clingan@oracle

JSR 353:适用于 JSON 处理的 Java API. John Clingan Java EE 和 GlassFish 产品经理 john.clingan@oracle.com. JSON 概述 JAX-RS 和 JSON JSR 353 JSON API. 议题. JSON 概述. 轻型数据交换格式. 方便人 / 机读写 最小开销 。 紧凑、文本、JavaScript 子集 示例 : {“name” :“John”, “age”:20, “phone”:[“2761234”, “1234567”]}

silver
Télécharger la présentation

John Clingan Java EE 和 GlassFish 产品经理 john.clingan@oracle

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. JSR 353:适用于 JSON 处理的 Java API John Clingan Java EE 和 GlassFish产品经理 john.clingan@oracle.com

  2. JSON 概述 • JAX-RS 和 JSON • JSR 353 • JSON API 议题

  3. JSON 概述 轻型数据交换格式 • 方便人/机读写 • 最小开销。紧凑、文本、JavaScript子集 • 示例:{“name” :“John”, “age”:20, “phone”:[“2761234”, “1234567”]} • 在 REST 式 web 服务、配置、数据库、浏览器服务器通信中大量使用

  4. JSON 概述 • 被许多知名网站用于其 REST 式 Web 服务 • Facebook、Twitter、Amazon • Twitter 流 API 已停止使用 XML

  5. Google 自定义搜索 API www.googleapis.com/customsearch/v1?key=[your-key]&cx=yourcx&q=java ee&alt=json { "kind": "customsearch#search", "url": { "type": "application/json", "template": "https://www.googleapis.com/customsearch/v1?q=..."} }, "queries": { "request": [ { "title": "Google Custom Search - javaee", "totalResults": "22", "searchTerms": "javaee", "count": 10, ...}

  6. JAX-RS XML 使用 • JAX-RS 应用程序使用 JAXP API 来处理 XML @Produces(“application/xml”) public Source getBook(String id) { return new StreamSource(…); }

  7. JAX-RS 数据绑定 • JAX-RS 应用程序使用 JAXB API 来处理 XML @Produces(“application/xml”, “application/json”) public Book getBook(String id) { return new Book(…); } XML JAX-RS JAXB Book ? JSON

  8. JAX-RS 针对 Java 的 JSON 实现 json-simple Json-marshaller mjson Jackson SOJO org.json json fastjson json-taglib Argo Stringtree jjson google-gson Flexjson json-io Json-smart Jettison

  9. JAX-RS JSON 解决方案及其限制 • 一个转换至 JSON 的自定义MessageBodyWriter • JSONObject(例如:json.org 的 API) JSON • POJO/JAXB  XML JSON(例如:使用 jettison) • POJO/JAXB JSON(例如:jackson、EclipseLink 等) • 没有标准API • 某些解决方案有一定的技术限制 • 应用程序/框架需要绑定实现

  10. 标准 API 概念 • JSR 353:解析/处理 JSON • 类似于 JAXP • 专家组 • Oracle、Red Hat、Twitter • 个人(GreenTea JUG/WenShao、Werner Keil、Christian Grobmeier) • 社区 • JSR 即将发布 • 数据绑定 — JSON 文本  Java 对象 • 类似于 JAXB

  11. JSR 353 — 透明性 • Json-processing-spec.java.net 开源项目 • 邮件列表 • users@json-processing-spec.java.net • jsr353-experts@json-processing-spec.java.net • 已存档 • 问题跟踪器 • http://java.net/jira/browse/JSON_PROCESSING_SPEC

  12. 适用于 JSON 处理的 Java API 概述 — JSR 353 • 解析并生成 JSON 的 API • 流 API • 低级别、高效率的 JSON 解析/生成方法 • 为解析器/生成器提供可插拔性 • 对象模型 • 简单易用的高级 API • 基于流 API 而实现 • JSON 绑定到 Java 的对象即将发布

  13. JSON 处理 API 架构 … 应用程序 1 应用程序 2 应用程序 N 对象模型 API 流 API SPI Provider

  14. 适用于 JSON 处理的 Java API 流 API • 以流方式解析来自输入源的 JSON • 类似于StaX的XMLStreamReader(pull解析器) • 使用以下内容创建 • Json.createParser(…) • Json.createParserFactory().createParser(…) • 分析状态事件 • START_ARRAY、END_ARRAY、START_OBJECT、END_OBJECT……

  15. 适用于 JSON 处理的 Java API 流式解析 • { • "firstName": "John", "lastName": "Smith", "age": 25, • "phoneNumber": [ • { "type": "home", "number": "212 555-1234" }, • { "type": "fax", "number": "646 555-4567" } • ] • }

  16. 适用于 JSON 处理的 Java API 流 API START_OBJECT { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }

  17. 适用于 JSON 处理的 Java API 流 API KEY_NAME { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }

  18. 适用于 JSON 处理的 Java API 流 API VALUE_STRING { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }

  19. 适用于 JSON 处理的 Java API 流 API VALUE_NUMBER { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }

  20. 适用于 JSON 处理的 Java API 流 API { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } START_ARRAY

  21. 适用于 JSON 处理的 Java API 流 API { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } END_ARRAY

  22. 适用于 JSON 处理的 Java API 流 API {"firstName": "John", "lastName": "Smith", "age": 25,"phoneNumber": [{ "type": "home", "number": "212 555-1234" },{ "type": "fax", "number": "646 555-4567" } ]} JsonParser parser = Json.createParser(request.getReader());Event event = parser.next(); // START_OBJECTevent = parser.next(); // KEY_NAMEevent = parser.next(); // VALUE_STRINGString name = parser.getString();// "John”

  23. 适用于 JSON 处理的 Java API 流 API • JsonGenerator • 以流方式为输出源生成 JSON • 类似于StaX的XMLStreamWriter • 使用以下内容创建 • Json.createGenerator(…) • Json.createGeneratorFactory().createGenerator(…) • 可选的配置特性 • 例如,用于美化输出

  24. 适用于 JSON 处理的 Java API 流 API JsonGeneratorjg= Json.createGenerator(…);jg..writeStartArray("phoneNumber").writeStartObject() .write("type", "home") .write("number", "408-123-4567") .writeEnd() .writeStartArray() .write("type", ”work") .write("number", "408-987-6543") .writeEnd() .writeEnd();jg.close(); "phoneNumber": [ { "type": "home", "number": ”408-123-4567” }, { "type": ”work", "number": ”408-987-6543” } ]

  25. 适用于 JSON 处理的 Java API 1.0 对象模型 API • JsonObject/JsonArray— JSON 对象和阵列结构 • 用于字符串值和数字值的 JsonString 和 JsonNumber • JsonObjectBuilder— 构建 JsonObject • JsonArrayBuilder—构建 JsonArray • JsonReader— 从输入源读取 JsonObject 和 JsonArray • JsonWriter— 向输出源写入 JsonObject 和 JsonArray

  26. 适用于 JSON 处理的 Java API 对象 API • 从输入源读取 JsonObject 和 JsonArray • i/o 读取器,InputStream(+ 编码) • 可选的配置特性 • 使用可插拔 JsonParser // Reads a JSON object try(JsonReader reader = Json.createReader(io)) { JsonObject obj = reader.readObject(); }

  27. 适用于 JSON 处理的 Java API 对象 API • 向输出源写入 JsonObject 和 JsonArray • i/o 写入器,OutputStream(+ 编码) • 可选的配置特性。例如,用于美化输出 • 使用可插拔 JsonGenerator // Writes a JSON object try(JsonWriter writer = Json.createWriter(io)) { writer.writeObject(obj); }

  28. 适用于 JSON 处理的 Java API JsonObject • 存放名称/值对和不可变的内容 • 名称/值对可作为 Map<String, JsonValue> 访问 JsonObject obj = reader.readObject(); Map<String, JsonValue> map = obj.getValues(); String str = obj.getStringValue(“foo”); Set<String> names = obj.getNames();

  29. 适用于 JSON 处理的 Java API 配置 • 支持解析器/生成器特性、可扩展性配置 • 美化打印,单括号字符串 • 可在流 API 和对象模型 API 中使用 • 在映射中传递 • Json.createBuilderFactory(Map<String, ?> config) • Json.createGeneratorFactory(Map<String, ?> config) • Json.createParserFactory(Map<String, ?> config) • Json.createReaderFactory(Map<String, ?> config) • Json.createWriterFactory(Map<String, ?> config)

  30. 令人惊奇的 JSR 采用者 联合起来我们可以共同推进 JAVA EE 的发展 您的 JUG 就在这里

  31. JSON 概述 • JAX-RS 和 JSON • JSR 353 • JSON API 总结

More Related