420 likes | 693 Views
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 Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data.
E N D
JSON Pointer and JSON Patch Updates to Java API for JSON Processing Kin-man Chung Oracle Corporation September 30, 2014
Program Agenda 1 2 3 4 5 6 JSON Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data
Program Agenda 1 2 3 4 5 6 JSON Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data
JSON Object Model Overview JsonValue • An immutable representation of a JSON value • Represented by: • JsonObject • JsonArray • JsonNumber • JsonString • Literals • TRUE, FALSE, and NULL
JSON Object Model Overview JsonObject • Represents a JSON object • java.util.Map<String, JsonValue> • Created with • JsonObjectBuilder • JsonObjectReader
JSON Object Model Overview JsonArray • Represents a JSON array • java.util.List<JsonValue> • Created with • JsonArrayBuilder • JsonArrayReader
JSON Object Model Overview Json • Factory class for creating JSON objects • Plugin factories with service provider • API includes • createObjectBuilder() • createArrayBuilder()
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"} } ]
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();
Program Agenda 1 2 3 4 5 6 JSON Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data
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
JSON Pointer Proposed API JsonArraycontacts= 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");
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
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
Program Agenda 1 2 3 4 5 6 JSON Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data
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
JSON Patch Example [ {"op":"replace", "path":"/1/phone", "value": { "areacode": "111", "number": "222-3333"} } {"from":"/1/phone", "path": "/2", "op":"copy"} ]
JSON Patch Operations • An patch operation is a JSON object • Must have an “op” field with a value of • “add”, “replace”, “remove”, “move”, “copy”, or “test” • Must have a “path” field • A JSON Pointer specifying the target location • Other fields depending on “op”
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);
Program Agenda 1 2 3 4 5 6 JSON Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data
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 when done
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 JsonObject John = Json.createObjectBuilder()… .build(); JsonArray result = builder.add(1, John) .build();
Program Agenda 1 2 3 4 5 6 JSON Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data
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 • 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);
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());
JSON Query with Java SE 8 Problem • Java Collectors return Lists or Maps. • We need collectors that returns JsonArrays or JsonObjects
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
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());
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"));
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")));
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);
Program Agenda 1 2 3 4 5 6 JSON Object Model Overview JSON Pointer JSON Patch JSON Editing/Transformation JSON Query with Java SE 8 Big JSON data
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
Support for big JSON data • Allow creation of partial JSON data in JsonParser • Add getJsonObject() at the beginning of an object • Add getJsonArray() at the beginning of an array • Allow skipping values in JsonParser • API for getting java.util.stream in JsonParser • Lazy evaluation, pull model • Low level: Stream of parse events • High level: Stream of JsonObject and JsonArray elements • Performance matters
Summary • Support for JSON Pointer and JSON Patch • Add editing/transformation to JsonObject and JsonArray • Add help class/method for JSON query • Add support for big JSON data • WARNING: The API changes are just proposals, are not final