Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธี Merge สอง JSON Strings ตามลำดับด้วย JsonParserSequence ใน Java (Jackson)

JsonParserSequence เป็น helper class ใช้สร้าง parser ที่ประกอบด้วยสอง sub-parsers วางใน ลำดับเฉพาะ (particular sequence) เราสามารถสร้าง sequence โดยใช้เมธอด static createFlattened() ของคลาส JsonParserSequence

Syntax

public static JsonParserSequence createFlattened(JsonParser first, JsonParser second)

ตัวอย่างการใช้งาน

import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.util.*;

public class JsonParserSequenceTest {
    public static void main(String[] args) throws JsonParseException, IOException {
        String jsonString1 = "{\"id\":\"101\", \"name\":\"Ravi Chandra\", \"address\":\"Pune\"}";
        String jsonString2 = "{\"id\":\"102\", \"name\":\"Raja Ramesh\", \"address\":\"Hyderabad\", \"contacts\":[{\"mobile\":\"9959984805\", \"home\":\"7702144400\"}]}";
        
        JsonFactory jsonFactory = new JsonFactory();
        JsonParser jsonParser1 = jsonFactory.createParser(jsonString1);
        JsonParser jsonParser2 = jsonFactory.createParser(jsonString2);
        
        JsonParserSequence jsonParserSequence = JsonParserSequence.createFlattened(jsonParser1, jsonParser2);
        
        JsonToken jsonToken = jsonParserSequence.nextToken();
        while (jsonToken != null) {
            switch (jsonToken) {
                case FIELD_NAME:
                    System.out.println("Key field: " + jsonParserSequence.getText());
                    break;
                case VALUE_FALSE:
                case VALUE_NULL:
                case VALUE_NUMBER_FLOAT:
                case VALUE_NUMBER_INT:
                case VALUE_STRING:
                case VALUE_TRUE:
                    System.out.println("Key value: " + jsonParserSequence.getText());
                    break;
            }
            jsonToken = jsonParserSequence.nextToken();
        }
        jsonParserSequence.close();
    }
}

ผลลัพธ์ (Output)

Key field: id
Key value: 101
Key field: name
Key value: Ravi Chandra
Key field: address
Key value: Pune
Key field: id
Key value: 102
Key field: name
Key value: Raja Ramesh
Key field: address
Key value: Hyderabad
Key field: contacts
Key field: mobile
Key value: 9959984805
Key field: home
Key value: 7702144400

คำอธิบาย

JsonParserSequence.createFlattened() รวมสอง parser เข้าด้วยกัน โดยอ่าน parser แรกจนจบ แล้วค่อยอ่าน parser ที่สอง ตรงกับชื่อ "flattened" - ทำให้สอง JSON objects กลายเป็น stream ของ tokens ต่อเนื่องเดียว

กรณีการใช้งาน (Use Cases)

  • Log aggregation - รวม JSON log entries หลายไฟล์
  • Stream processing - ประมวลผล JSON streams หลายแหล่งต่อเนื่อง
  • Batch processing - อ่าน multiple JSON files วนลูปเดียว
  • Testing - สร้าง test data จากหลาย JSON sources

ข้อควรระวัง

  • ไม่ merge JSON objects (ไม่รวม key ซ้ำ) แค่ concatenate token streams
  • ทั้งสอง parser ต้องเป็น valid JSON structures
  • Memory efficient - streaming, ไม่โหลดทั้งหมดในหน่วยความจำ

ตัวเลือกอื่นสำหรับ Merge JSON

  • ObjectMapper.readTree() + deep merge - merge object contents จริงๆ
  • JSON Patch (RFC 6902) - apply patches
  • JSON Merge Patch (RFC 7386) - merge patch semantics

สรุป

JsonParserSequence.createFlattened() ให้วิธี streaming-efficient ในการรวม multiple JSON parsers ให้กลายเป็น single token stream เหมาะสำหรับการประมวลผล batch/stream ของ JSON data หลายแหล่ง