2012-07-12 26 views
16

Khi tôi đã phân tích cú pháp chuỗi JSON thành GSON đã cung cấp lớp JsonObject, (giả sử rằng tôi không muốn phân tích nó thành bất kỳ đối tượng dữ liệu có ý nghĩa nào, nhưng nghiêm túc muốn sử dụng JsonObject), làm cách nào tôi có thể sửa đổi trường/giá trị của một chìa khóa trực tiếp?Làm thế nào để sửa đổi các giá trị của JsonObject/JsonArray trực tiếp?

Tôi không thấy API có thể giúp tôi.

https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonObject.html

Trả lời

38

Kỳ lạ, câu trả lời là tiếp tục thêm lại thuộc tính. Tôi đã mong đợi một phương pháp setter. : S

System.out.println("Before: " + obj.get("DebugLogId")); // original "02352" 

obj.addProperty("DebugLogId", "YYY"); 

System.out.println("After: " + obj.get("DebugLogId")); // now "YYY" 
+1

Họ nên đã gọi là putProperty này. Nó sẽ làm cho nó rõ ràng hơn. Nó cũng không tuyên bố bất cứ điều gì trong tài liệu này thay thế các thuộc tính hiện có, nhưng tôi đoán nó sẽ không hợp lệ Json nếu không. – clu

1

cách tiếp cận khác sẽ được deserialize thành một java.util.Map, và sau đó chỉ cần sửa đổi Java Map như mong muốn. Điều này phân tách việc xử lý dữ liệu phía Java từ cơ chế truyền tải dữ liệu (JSON), đó là cách tôi muốn tổ chức mã của tôi: sử dụng JSON để truyền dữ liệu, không phải là cấu trúc dữ liệu thay thế.

+0

Cảm ơn, có lẽ cũng là lý do tại sao không có một setter ở nơi đầu tiên. –

+0

"remove()" - hoặc thêm() một lần nữa nếu bạn đang sử dụng phiên bản trước 2 (không chắc chắn về phiên bản chính xác, nhưng tôi đã thấy sự khác biệt giữa 1.2.3 và 2.2.4 API). – orbfish

1

Nó thực sự là tất cả trong tài liệu.
JSONObject và JSONArray có thể được sử dụng để thay thế cấu trúc dữ liệu chuẩn.
Để triển khai setter, chỉ cần gọi remove(String name) trước số put(String name, Object value).

Dưới đây là một ví dụ đơn giản:

public class BasicDB { 

private JSONObject jData = new JSONObject; 

public BasicDB(String username, String tagline) { 
    try { 
     jData.put("username", username); 
     jData.put("tagline" , tagline); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public String getUsername() { 
    String ret = null; 
    try { 
     ret = jData.getString("username"); 
    } catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    return ret; 
} 

public void setUsername (String username) { 
    try { 
     jData.remove("username"); 
     jData.put("username" , username); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public String getTagline() { 
    String ret = null; 
    try { 
     ret = jData.getString("tagline"); 
    } catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    return ret; 
} 
+0

Thư viện sai. Đầu tiên tôi tự hỏi nơi bạn có phương thức put(), sau đó tôi nhận ra bạn đã nói JSONObject, là thư viện json.org, không phải là JsonObject, phiên bản GSON. – orbfish

5

Kể từ 2.3 phiên bản của thư viện Gson lớp JsonArray có một phương pháp 'đặt'.

Dưới đây là một ví dụ đơn giản:

JsonArray array = new JsonArray(); 
array.add(new JsonPrimitive("Red")); 
array.add(new JsonPrimitive("Green")); 
array.add(new JsonPrimitive("Blue")); 

array.remove(2); 
array.set(0, new JsonPrimitive("Yelow")); 
4

này làm việc cho điều chỉnh giá trị sử dụng childkey JSONObject. nhập khẩu sử dụng là

import org.json.JSONObject; 

cũ json: (chuyển đổi tệp json để chuỗi trong khi cho như là đầu vào)

{ 
    "parentkey1": "name", 
    "parentkey2": { 
    "childkey": "test" 
    }, 
} 

JSONObject jObject = new JSONObject(String jsoninputfileasstring); 
jObject.getJSONObject("parentkey2").put("childkey","data1"); 
System.out.println(jObject); 

đầu ra:

{ 
    "parentkey1": "name", 
    "parentkey2": { 
    "childkey": "data1" 
    }, 
} 
+0

Sử dụng định dạng thích hợp để làm cho nó rõ ràng và dễ đọc. –

+0

chỉ muốn nhấn mạnh câu hỏi là về com.google.gson.JsonObject chứ không phải org.json.JSONObject. Câu trả lời được chọn và được trả lời nhiều nhất, ở dưới cùng, có vẻ đúng – javaNoober

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