2012-07-16 30 views
12

Tôi đang sử dụng Jackson 1.9.5 trong một dự án Android để phân tích các tệp JSON.Jackson ObjectMapper với các khóa JSON tùy ý

Cho đến nay tôi đã không có bất kỳ vấn đề, và có thể phân tích các file tốt bằng cách sử dụng đoạn mã sau:

AssetManager mgr = getAssets(); 
ObjectMapper mapper = new ObjectMapper(); 

try { 
    InputStream ifp = mgr.open("detail_schema.json"); 
    schema = mapper.readValue(ifp, DetailSchema.class); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Trường hợp lớp DetailSchema bao gồm một hỗn hợp các loại nguyên thủy và các lớp học. Tôi hiện đang gặp sự cố khi tôi muốn phân tích cú pháp một số JSON như sau:

"fields": { 
    "Suburb": "Paddington", 
    "State": "NSW", 
    "Post Code": "2074", 
    "Lollipop": "Foo Bar Haz" 
} 

Tôi không thể biết khóa bản đồ trước khi bàn tay (chúng có thể do người dùng xác định). Như vậy, tôi không chắc chắn về lớp Java liên quan sẽ trông như thế nào.

Ie, ví dụ này, nó có thể trông giống như:

public class MyClass { 

    public String Suburb; 
    public String State; 
    public String PostCode; 
    public String Lollipop; 

} 

Nhưng điều này có thể không chính xác cho một ví dụ của tập tin JSON. Lý tưởng nhất là tôi cần một số cách để Jackson lập bản đồ các giá trị cho một cái gì đó như một số NameValuePair. Tôi nghi ngờ rằng ánh xạ đối tượng tự động có thể không phải là một tùy chọn trong trường hợp này - ai đó có thể xác nhận hoặc từ chối điều này?

Trả lời

16

Bạn có hai tùy chọn. Hoặc bạn có thể sử dụng readTree in ObjectMapper, trả về một số JsonNode. Làm việc với một JsonNode giống như làm việc với một cây, vì vậy bạn có thể nhận được các nút con, đọc các giá trị, v.v.

Hoặc, bạn có thể cho Jackson deserialize nó như một bản đồ, trong trường hợp bạn muốn sử dụng mã của bạn nhưng nơi MyClass sẽ là như thế này:

public class MyClass { 
    public Map<String, Object> fields; 

    // getter/setters 
} 

Bạn có lẽ có thể gõ các giá trị bản đồ như String như tốt nếu bạn chắc chắn đầu vào là văn bản trong json. (Thực ra, tôi không chắc Jackson thực thi loại nào, có lẽ nó sẽ cho phép bất cứ điều gì ...)

+1

Xin cảm ơn! Bản đồ sẽ hoạt động tốt cho mục đích của tôi. – aaronsnoswell

+0

Bạn thực sự không phải sử dụng một lớp tùy chỉnh để có được một 'Bản đồ', bạn có thể có Jackson deserialize trực tiếp đến việc thực hiện giao diện' Bản đồ', ví dụ: 'Bản đồ jsonFields = mapper.readValue (ifp, HashMap .class) ' – brianmearns

Các vấn đề liên quan