2015-06-08 20 views
5

Mam następujący ciąg przekazywane do serwera:Gson: Nie JSON obiektu

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

który jest prawidłowy json dla http://jsonlint.com/

chcę uzyskać pole organy tablicy.

To jak ja to robię:

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

Ale w drugim wierszu dostaję wyjątek wymienione poniżej:

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\"}]}" 

Jak to zrobić właściwie wtedy?

+1

Może chcesz rzucić okiem na ten http://stackoverflow.com/a/15116323/2044733. Druga opcja, zaczynająca się od "Aby użyć JsonObject", wygląda dokładnie tak, jak chcesz. – bbill

Odpowiedz

4

Użyłem wcześniej metody parse, jak opisano w https://stackoverflow.com/a/15116323/2044733 i działa.

Rzeczywisty kod wyglądałby

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

Od the docs wygląda jak używasz do błędu opisanego gdzie uzna to Twój obiekt toJsonTree nie jest odpowiedniego typu.

ten kod jest równoważne

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

jak wspomniano tu w innych odpowiedzi i połączonego gwintu.

+1

tak, twoje rozwiązanie działa dla mnie! – marknorkin

8

Gson#toJsonTree javadoc stwierdza

Metoda ta serializes określony obiekt do jego odpowiednik reprezentacji jako drzewa JsonElement s.

Oznacza to, że w zasadzie nie

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

Java String jest konwertowany do JSON ciąg, tj. a JsonPrimitive, a nie JsonObject. Innymi słowy, toJsonTree interpretuje zawartość wartości przekazanej jako ciąg JSON, a nie obiekt JSON.

Należy użyć

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

bezpośrednio do konwertowania String do JsonObject.

-1

Co z JsonArray jsonBodies = object.getAsJsonArray ("bodies");

+0

Co to zmieni, biorąc pod uwagę wyjątek dzieje się na 'getAsJsonObject'? –

Powiązane problemy