2015-06-08 18 views
5

Tôi đã String sau truyền đến máy chủ:Gson: Không phải là một đối tượng JSON

{ 
    "productId": "", 
    "sellPrice": "", 
    "buyPrice": "", 
    "quantity": "", 
    "bodies": [ 
     { 
      "productId": "1", 
      "sellPrice": "5", 
      "buyPrice": "2", 
      "quantity": "5" 
     }, 
     { 
      "productId": "2", 
      "sellPrice": "3", 
      "buyPrice": "1", 
      "quantity": "1" 
     } 
    ] 
} 

mà là một json hợp lệ cho http://jsonlint.com/

Tôi muốn để có được những lĩnh vực cơ quan mảng.

Đó là cách tôi đang làm nó:

Gson gson = new Gson(); 
JsonObject object = gson.toJsonTree(value).getAsJsonObject(); 
JsonArray jsonBodies = object.get("bodies").getAsJsonArray(); 

Nhưng trên dòng thứ hai tôi nhận được ngoại lệ được liệt kê dưới đây:

HTTP Status 500 - Not a JSON Object: "{\"productId\":\"\",\"sellPrice\":\"\",\"buyPrice\":\"\",\"quantity\":\"\",\"bodies\":[{\"productId\":\"1\",\"sellPrice\":\"5\",\"buyPrice\":\"2\",\"quantity\":\"5\"},{\"productId\":\"2\",\"sellPrice\":\"3\",\"buyPrice\":\"1\",\"quantity\":\"1\"}]}" 

Làm thế nào để làm điều đó đúng rồi?

+1

Có thể muốn xem http://stackoverflow.com/a/15116323/2044733 này. Tùy chọn thứ hai, bắt đầu "Để sử dụng JsonObject," trông giống như chính xác những gì bạn muốn. – bbill

Trả lời

4

Tôi đã sử dụng phương pháp parse như được mô tả trong https://stackoverflow.com/a/15116323/2044733 trước đây và đã hoạt động.

Mã thực tế sẽ như thế nào

JsonParser jsonParser = new JsonParser(); 
jsonParser.parse(json).getAsJsonObject(); 

Từ the docs có vẻ như bạn đang chạy vào lỗi được mô tả nơi nó bạn nghĩ đối tượng toJsonTree của bạn không phải là loại chính xác.

Đoạn mã trên là tương đương với

JsonObject jelem = gson.fromJson(json, JsonElement.class); 

như đã đề cập trong một câu trả lời ở đây và trên các chủ đề liên quan.

+1

có, giải pháp của bạn đã làm việc cho tôi! – marknorkin

8

Gson#toJsonTree javadoc khẳng định

Phương pháp này serializes các đối tượng quy định vào tương đương với đại diện của mình như một cây sự JsonElement s.

Nghĩa là, nó về cơ bản không

String jsonRepresentation = gson.toJson(someString); 
JsonElement object = gson.fromJson(jsonRepresentation, JsonElement.class); 

Một Java String được chuyển thành một JSON String, tức là. a JsonPrimitive, không phải là JsonObject. Nói cách khác, toJsonTree diễn giải nội dung của giá trị String mà bạn đã truyền dưới dạng chuỗi JSON, không phải là đối tượng JSON.

Bạn nên sử dụng

JsonObject object = gson.fromJson(value, JsonObject.class); 

trực tiếp, để chuyển đổi của bạn String đến một JsonObject.

-1

Còn khoảng JsonArray jsonBodies = object.getAsJsonArray ("cơ quan");

+0

Điều gì sẽ thay đổi này xem xét ngoại lệ xảy ra trên 'getAsJsonObject'? –

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