1 / 48

JSON Pointer and JSON Patch

JSON Pointer and JSON Patch. U pdates to Java API for JSON Processing. Kin-man Chung Oracle Corporation September 30, 2014. Program Agenda. 1. 2. 3. 4. 5. 6. JSON-P API Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data.

mark-lynch
Download Presentation

JSON Pointer and JSON Patch

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. JSON Pointer and JSON Patch Updates to Java API for JSON Processing Kin-man Chung Oracle Corporation September 30, 2014

  2. Program Agenda 1 2 3 4 5 6 JSON-P API Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data

  3. Program Agenda 1 2 3 4 5 6 JSON-P Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data

  4. JSON Object Model Overview JsonValue • An immutable representation of a JSON value • Represented by: • JsonObject • JsonArray • JsonNumber • JsonString • Literals • TRUE, FALSE, and NULL

  5. JSON Object Model Overview JsonObject • Represents a JSON object • java.util.Map<String, JsonValue> • Created with • JsonObjectBuilder • JsonObjectReader

  6. JSON Object Model Overview JsonArray • Represents a JSON array • java.util.List<JsonValue> • Created with • JsonArrayBuilder • JsonArrayReader

  7. JSON Object Model Overview Json • Factory class for creating JSON data • Plugin factories with service provider • API includes • createObjectBuilder() • createArrayBuilder()

  8. Example: contacts in JSON [ { "name": "Duke", "gender": "M", "phone": { "areacode": "650", "number": "234-5678"} }, { "name": "Jane", ”gender": "F", "phone": { "areacode": "777", "number": "999-5555"} }, { "name": "Amy", "gender": "F", "phone": { "areacode": "505" "number": "333-4444"} } ]

  9. Example: contacts in JSON object model JsonArray contacts = Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("name", "Duke") .add("gender", "M") .add("phone", Json.createObjectBuilder() .add("areacode", "650") .add("number", "234-5678"))) .add(Json.createObjectBuilder() .add("name", "Jane") .add("gender", "F") .add("phone", Json.createObjectBuilder() .add("areacode", ”777") .add("number": "999-5555"))) .add(Json.createObjectBuilder() .add("name", “Amy") .add("gender", "F") .add("phone", Json.createObjectBuilder() .add("areacode", "505") .add("number", "333-4444"))) .build();

  10. Example: contacts in JSON object model JsonArray contacts = Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("name", "Duke") .add("gender", "M") .add("phone", Json.createObjectBuilder() .add("areacode", "650") .add("number", "234-5678"))) .add(Json.createObjectBuilder() .add("name", "Jane") .add("gender", "F") .add("phone", Json.createObjectBuilder() .add("areacode", ”777") .add("number": "999-5555"))) .add(Json.createObjectBuilder() .add("name", “Amy") .add("gender", "F") .add("phone", Json.createObjectBuilder() .add("areacode", "505") .add("number", "333-4444"))) .build();

  11. Example: contacts in JSON object model JsonArray contacts = Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("name", "Duke") .add("gender", "M") .add("phone", Json.createObjectBuilder() .add("areacode", "650") .add("number", "234-5678"))) .add(Json.createObjectBuilder() .add("name", "Jane") .add("gender", "F") .add("phone", Json.createObjectBuilder() .add("areacode", ”777") .add("number": "999-5555"))) .add(Json.createObjectBuilder() .add("name", “Amy") .add("gender", "F") .add("phone", Json.createObjectBuilder() .add("areacode", "505") .add("number", "333-4444"))) .build();

  12. JSON Streaming Model Overview JsonParser • Produces stream of parser events • Parser events • START_OBJECT, END_OBJECT, START_ARRAY, END_ARRAY • KEY_NAME, VALUE_STRING, VALUE_NUMBER • VALUE_TRUE, VALUE_FALSE, VALUE_NULL • Low level • Pull • Application controls accessing and advancing parser events • Suitable for processing big JSON data

  13. JSON Streaming API Example: create a JsonArray JsonArrayBuilderarrayBuilder; JsonParserparser = Json.createParser(. . .); while (parser.hasNext()) { JsonParser.Eventevent = parser.next(); switch(event) { case START_ARRAY: arrayBuilder = Json.createArrayBuilder(); break; case VALUE_STRING: arrayBuilder.add(parser.getString()); break; case END_ARRAY: // do something with the array process(arrayBuilder.build()); break; case START_OBJECT: . . . } }

  14. Program Agenda 1 2 3 4 5 6 JSON-P API Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data

  15. JSON Pointer • Specified in RFC 6901 • A string syntax for referencing a JSON value • Example • /0/phone/number • refers to the phone number of first person in the contacts

  16. JSON Pointer Proposed API JsonArray contacts = Json.createArrayBuilder().add(…).build(); // Create a JsonPointer JsonPointer p = Json.createPointer("/0/phone/number"); // Get the value at the referenced location in the target JsonValue v = p.getValue(contacts); // Replace a value at the referenced location, returning a new array // with the change JsonArray result = p.replace(contacts, "123-4567");

  17. JSON Pointer Methods in JsonPointer • getValue • Get the value at the referenced location • add • Add/insert a value at the referenced location • replace • Replace a value at the referenced location • remove • Remove a value at the referenced location

  18. JSON Pointer Operations in JsonPointer • An operation is applied to a JsonArray or JsonObject • Operations do not modify the target JsonArray or JsonObject • Operation add, replace, or remove returns a new JsonArray or JsonObjectcontaining the result • Transforms the target into the result

  19. Program Agenda 1 2 3 4 5 6 JSON-P API Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data

  20. JSON Patch • Specified in RFC 6902 • Sequence of operations for modifying a JSON document • Operations specified in a JSON array • Suitable for use in http PATCH method

  21. JSON Patch Example [ {"op":"replace", "path":"/1/phone", "value": { "areacode": "111", "number": "222-3333"} } {"from":"/1/phone", "path": "/2", "op":"copy"} ]

  22. JSON Patch Operations • A JSON patch is an array of operations • An patch operation is a JSON object • Each operation must have an “op” field with a value of • “add”, “replace”, “remove”, “move”, “copy”, or “test” • Each operation must have a “path” field • A JSON Pointer specifying the target location • Other fields depending on “op”

  23. JSON Patch Proposed API // Create the target and the patch JsonArray target = Json.createArrayBuilder().add(…).build(); JsonArray patch = Json.createArrayBuilder()… .build(); // Create JsonPatch from patch JsonPatchjsonpatch= Json.createPatch(patch); // Apply the patch to the target and return the result JsonArray result = jsonpatch.apply(target);

  24. Program Agenda 1 2 3 4 5 6 JSON-P API Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data

  25. JSON Editing/Transformation • A JSON Patch transforms a JSON target to a JSON result • Propose adding capability to edit a JsonArray or JsonObject • Use builder pattern: • Create builders with initial JsonArray or JsonObject • Add to ObjectBuilder • remove(name) • Add to ArrayBuilder • add(index, value), set(index, value), remove(index) • Builder returns immutable JsonArray or JsonObject from build()

  26. JSON Editing Proposed API // Create the target JsonArray target = Json.createArrayBuilder().add(…).build(); // Create a builder initialized with the target JsonArrayBuilder builder = Json.createArrayBuilder(target); // Creates a new object and insert it into the array JsonObjectjohn = Json.createObjectBuilder()… .build(); JsonArray result = builder.add(1, john) .build();

  27. Program Agenda 1 2 3 4 5 6 JSON=P API Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data

  28. JSON Query with Java SE 8 • A JsonObject is a Map, and a JsonArray is a List, so queries can be implemented with Java’s stream operations, using Lambda expressions • Get concurrent processing for free • Example: Output names of contacts whose gender is F JsonArray contacts; contacts.getValuesAs(JsonObject.class).stream() .filter(x->"F".equals(x.getString("gender"))) .map(x->x.getString("name")) .forEach(System.out::println);

  29. JSON Query with Java SE 8 • Example: Collect query results in a List JsonArray contacts; List<String> names = contacts.getValuesAs(JsonObject.class).stream() .filter(x->"F".equals(x.getString("gender"))) .map(x->x.getString(“name”)) .collect(Collectors.toList());

  30. JSON Query with Java SE 8 Problem • Java Collectors return Lists or Maps. • We need collectors that return JsonArrays or JsonObjects

  31. JSON Query with Java SE 8 Proposed API • New helper class JsonCollectors that construct Collectors for JSON objects or arrays • toJsonArray: • Accumulates values in a JsonArray • toJsonObject: • Accumulates values in a JsonObject • groupBy • Implements “group by” operations on the values

  32. JSON Query with Java SE 8 Example • Collect the query result in a JsonArray JsonArray contacts; JsonArray names = contacts.getValuesAs(JsonObject.class).stream() .filter(x->"F".equals(x.getString("gender"))) .map(x->x.getString("name")) .collect(JsonCollectors.toJsonArray());

  33. JSON Query with Java SE 8 Example • Collect the query result in a JsonObject JsonArray contacts; JsonObjectnameToPhones = contacts.getValuesAs(JsonObject.class).stream() .filter(x->"F".equals(x.getString("gender"))) .collect(JsonCollectors.toJsonObject( x->x.getString("name"), x->x.getJsonObject("phone"));

  34. JSON Query with Java SE 8 Example • Group the contacts by gender JsonArray contacts; JsonObject groups = contacts.getValuesAs(JsonObject.class).stream() .collect(JsonCollectors.groupBy(x->getString("gender")));

  35. JSON Query with Java SE 8 Example: Putting it all together • Change the phone areacodes from “415” to “650” Static int index = -1; JsonArray patch =contacts.getValuesAs(JsonObject.class).stream() .peek(x->index++) .filter(x->x.getObject("phone").getString("areacode").equals("415")) .map(Json.createObjectBuilder() .add("op", "replace") .add("path", "/"+index+"/phone/areacode") .add("value", “650”) .build()) .collect(JsonCollectors.toJsonArray()); JsonArray result = Json.createPatch(patch).apply(contacts);

  36. Program Agenda 1 2 3 4 5 6 JSON-P API Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data

  37. Support for big JSON data • Big JSON data • Cannot fit in memory • Generated dynamically • Potentially infinite • We already have a stream model, suitable for processing big data • Add API to make it more useful

  38. Support for big JSON data • Creating partial JSON data in JsonParser • Create an object at START_OBJECT • Create an array at START_ARRAY • Skipping values in JsonParser • Skip enclosing array • Skip enclosing object • Skip long string

  39. Support for big JSON data • Creating java.util.stream in JsonParser • For processing or querying of the created object or array • Create stream when creating objects or arrays • Lazy evaluation, as needed • Get optimization hints from the operation • Filter or short-circuit operations trigger skipping • Seamless integration with JsonParser event stream

  40. Summary • Support for JSON Pointer and JSON Patch • Add editing/transformations to JsonObject and JsonArray • Add helper classes/methods for JSON query • Add support for big JSON data • WARNING: The API changes are just proposals, are not final

  41. Status • Proposed JSR to be submitted • Watch https://www.jcp.org for announcement • Roadmap • Expert Group formed: 2014 • Public Review Draft: 2015 • Proposed Final Draft: 2015 • Final Release: 2016

  42. Reference Info • Questions and comments • users@json-processing-spec.java.net • Interested to join Expert Group • Nominate yourself at new JSR page (when approved) • Personal contact • kinman.chung@oracle.com

  43. Q & A

More Related