Return to site

🧩🧾 JSON-P & JSON-B: READ/WRITE JSON IN JAVA

· jakartaee

🔸 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) 🔁

Section image

🔸 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👇