🔸 TL;DR 🧠
▪️ JSON-P Model API = build/parse JSON trees 🌳
▪️ JSON-P Streaming API = process huge JSON efficiently 🌊
▪️ JSON Pointer = access nested values with a path 🎯
▪️ JSON Patch = apply structured JSON updates 🩹
▪️ JSON-B = clean POJO mapping (JSON ↔ Java) 🔁

🔸 QUICK NOTE (WHY PACKAGES CHANGED) 🔁
▪️ In Jakarta EE 9+, the APIs moved from javax.* ➜ jakarta.* (same concepts, new namespace) ✅
🔸 JSON-P “TREE” STYLE: BUILD + READ JSON WITH THE MODEL API 🌳
▪️ Create JSON programmatically:
import jakarta.json.*; JsonObject json = Json.createObjectBuilder() .add("name", "Vincent") .add("skills", Json.createArrayBuilder() .add("Java").add("Jakarta EE").add("Kafka")) .add("active", true) .build(); System.out.println(json.toString());
▪️ Parse JSON into a tree:
import jakarta.json.*; JsonObject obj = Json.createReader(new java.io.StringReader(""" {"count": 3, "tags": ["json", "jakarta"]} """)).readObject(); int count = obj.getInt("count"); JsonArray tags = obj.getJsonArray("tags");
🔸 JSON-P “STREAMING” STYLE: FAST + LOW MEMORY FOR BIG JSON 🌊
▪️ Write JSON as a stream:
import jakarta.json.*; import jakarta.json.stream.*; java.io.StringWriter out = new java.io.StringWriter(); JsonGenerator gen = Json.createGenerator(out); gen.writeStartObject() .write("type", "event") .writeStartArray("items") .write("a").write("b") .writeEnd() .writeEnd() .close(); System.out.println(out);
▪️ Parse JSON token by token:
import jakarta.json.*; import jakarta.json.stream.*; JsonParser parser = Json.createParser(new java.io.StringReader(""" {"user":{"id":42,"name":"Ada"}} """)); while (parser.hasNext()) { JsonParser.Event e = parser.next(); if (e == JsonParser.Event.KEY_NAME && "id".equals(parser.getString())) { parser.next(); // VALUE_NUMBER System.out.println("id=" + parser.getInt()); } } parser.close();
🔸 JSON POINTER: TARGET A SPECIFIC VALUE 🎯
import jakarta.json.*; JsonObject doc = Json.createReader(new java.io.StringReader(""" {"user":{"profile":{"email":"a@b.com"}}} """)).readObject(); JsonValue email = Json.createPointer("/user/profile/email").getValue(doc); System.out.println(email); // "a@b.com"
🔸 JSON PATCH: APPLY “OPERATIONS” TO MODIFY JSON 🩹
import jakarta.json.*; JsonObject doc = Json.createReader(new java.io.StringReader(""" {"name":"Vincent","level":"mid"} """)).readObject(); JsonPatch patch = Json.createPatchBuilder() .replace("/level", "senior") .add("/topics", Json.createArrayBuilder().add("json").add("jakarta")) .build(); JsonValue updated = patch.apply(doc); System.out.println(updated);
🔸 JSON-B: JSON ↔ POJOS (THE “MAPPER” WAY) 🔁
▪️ JSON → Java objects:
import jakarta.json.bind.*; import jakarta.json.bind.JsonbBuilder; public class User { public String name; public int age; } Jsonb jsonb = JsonbBuilder.create(); User u = jsonb.fromJson(""" {"name":"Ada","age":37} """, User.class); System.out.println(u.name);
▪️ Java objects → JSON string:
import jakarta.json.bind.*; User u = new User(); u.name = "Ada"; u.age = 37; Jsonb jsonb = JsonbBuilder.create(); String json = jsonb.toJson(u); System.out.println(json);
🔸 TAKEAWAYS ✅
▪️ Pick JSON-B for most “business JSON ↔ POJOs” use cases
▪️ Pick JSON-P Streaming when performance/memory matters
▪️ Use Pointer + Patch for surgical JSON edits (great for REST partial updates)
▪️ Mixing JSON-P + JSON-B is totally fine in real projects 🛠️
#Java #JakartaEE #JSON #JSONP #JSONB #Backend #APIs #SoftwareEngineering #Programming #CleanCode
Go further with Java certification:
Java👇
Spring👇
SpringBook👇
JavaBook👇