330 likes | 557 Views
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”]}
E N D
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”]} • 在 REST 式 web 服务、配置、数据库、浏览器服务器通信中大量使用
JSON 概述 • 被许多知名网站用于其 REST 式 Web 服务 • Facebook、Twitter、Amazon • Twitter 流 API 已停止使用 XML
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, ...}
JAX-RS XML 使用 • JAX-RS 应用程序使用 JAXP API 来处理 XML @Produces(“application/xml”) public Source getBook(String id) { return new StreamSource(…); }
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
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
JAX-RS JSON 解决方案及其限制 • 一个转换至 JSON 的自定义MessageBodyWriter • JSONObject(例如:json.org 的 API) JSON • POJO/JAXB XML JSON(例如:使用 jettison) • POJO/JAXB JSON(例如:jackson、EclipseLink 等) • 没有标准API • 某些解决方案有一定的技术限制 • 应用程序/框架需要绑定实现
标准 API 概念 • JSR 353:解析/处理 JSON • 类似于 JAXP • 专家组 • Oracle、Red Hat、Twitter • 个人(GreenTea JUG/WenShao、Werner Keil、Christian Grobmeier) • 社区 • JSR 即将发布 • 数据绑定 — JSON 文本 Java 对象 • 类似于 JAXB
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
适用于 JSON 处理的 Java API 概述 — JSR 353 • 解析并生成 JSON 的 API • 流 API • 低级别、高效率的 JSON 解析/生成方法 • 为解析器/生成器提供可插拔性 • 对象模型 • 简单易用的高级 API • 基于流 API 而实现 • JSON 绑定到 Java 的对象即将发布
JSON 处理 API 架构 … 应用程序 1 应用程序 2 应用程序 N 对象模型 API 流 API SPI Provider
适用于 JSON 处理的 Java API 流 API • 以流方式解析来自输入源的 JSON • 类似于StaX的XMLStreamReader(pull解析器) • 使用以下内容创建 • Json.createParser(…) • Json.createParserFactory().createParser(…) • 分析状态事件 • START_ARRAY、END_ARRAY、START_OBJECT、END_OBJECT……
适用于 JSON 处理的 Java API 流式解析 • { • "firstName": "John", "lastName": "Smith", "age": 25, • "phoneNumber": [ • { "type": "home", "number": "212 555-1234" }, • { "type": "fax", "number": "646 555-4567" } • ] • }
适用于 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" } ] }
适用于 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" } ] }
适用于 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" } ] }
适用于 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" } ] }
适用于 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
适用于 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
适用于 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”
适用于 JSON 处理的 Java API 流 API • JsonGenerator • 以流方式为输出源生成 JSON • 类似于StaX的XMLStreamWriter • 使用以下内容创建 • Json.createGenerator(…) • Json.createGeneratorFactory().createGenerator(…) • 可选的配置特性 • 例如,用于美化输出
适用于 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” } ]
适用于 JSON 处理的 Java API 1.0 对象模型 API • JsonObject/JsonArray— JSON 对象和阵列结构 • 用于字符串值和数字值的 JsonString 和 JsonNumber • JsonObjectBuilder— 构建 JsonObject • JsonArrayBuilder—构建 JsonArray • JsonReader— 从输入源读取 JsonObject 和 JsonArray • JsonWriter— 向输出源写入 JsonObject 和 JsonArray
适用于 JSON 处理的 Java API 对象 API • 从输入源读取 JsonObject 和 JsonArray • i/o 读取器,InputStream(+ 编码) • 可选的配置特性 • 使用可插拔 JsonParser // Reads a JSON object try(JsonReader reader = Json.createReader(io)) { JsonObject obj = reader.readObject(); }
适用于 JSON 处理的 Java API 对象 API • 向输出源写入 JsonObject 和 JsonArray • i/o 写入器,OutputStream(+ 编码) • 可选的配置特性。例如,用于美化输出 • 使用可插拔 JsonGenerator // Writes a JSON object try(JsonWriter writer = Json.createWriter(io)) { writer.writeObject(obj); }
适用于 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();
适用于 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)
令人惊奇的 JSR 采用者 联合起来我们可以共同推进 JAVA EE 的发展 您的 JUG 就在这里
JSON 概述 • JAX-RS 和 JSON • JSR 353 • JSON API 总结