2013-05-23 5 views
7

Я пытаюсь разобрать json на java.JSON String к объекту Java с использованием GSON

У меня есть следующая строка, которая действует в соответствии с JSON jsonlint.com

private final static String LOC_JSON = 
     "[" 
     +"{" 
     +" \"lat1\": 39.737567," 
     +" \"lat2\": 32.7801399," 
     +" \"long1\": -104.98471790000002," 
     +" \"long2\": -96.80045109999998" 
     +"}," 
     +" [" 
     +"  {" 
     +"   \"lat\": {" 
     +"    \"b\": 38.88368709500021," 
     +"    \"d\": 40.620468491667026" 
     +"   }," 
     +"   \"long\": {" 
     +"   \"b\": -105.75306170749764," 
     +"   \"d\": -104.675854661387" 
     +"   }" 
     +"  }" 
     +" ]" 
     +"]"; 

Я пытаюсь разобрать его в объект, и я получаю следующее сообщение об ошибке. "Ожидаемое BEGIN_OBJECT но BEGIN_ARRAY в строке 1 колонке 2"

  Gson gson = new Gson(); 
     BoxSearch b = gson.fromJson(LOC_JSON, BoxSearch.class); 

BoxSearch состоит из этого.

private Number lat1; 
private Number lat2; 
private Number long1; 
private Number long2; 
private Boxes[] boxes; 

Коробки - это объект «Локатор» и объект Долгота, которые оба определены одинаковыми.

private String b; 
private String d; 

можно разобрать высшие атрибуты уровня (LAT1, LAT2, long1 и long2) в более простой объект BoxSearch, который имеет только эти 4 атрибуты. Проблема возникает, когда json и объект более сложны. Можно ли даже делать то, что я пытаюсь сделать?

Надеюсь, я предоставил достаточно информации, чтобы получить помощь. Я был бы рад предоставить дополнительную информацию или даже тестовый проект, если потребуется. Я запускаю это как тест junit.

Спасибо.

+3

Возможный дубликат [GSON throwing "Ожидаемое НАЧИНАНИЕ \ _OBJECT, но НАЧАЛО \ _ARRAY"?] (Http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin -array) - ваш JSON - это массив, а не объект. У вас будет проблема, потому что это массив, содержащий разные типы объектов (объект и массив), с которыми вы не справитесь, без написания настраиваемого десериализатора. –

+0

@BrianRoach это больше похоже на ответ;) –

+0

@RC. Да ... Хм. Я думаю, может быть, я переведу его, старый Q отвечает, почему он получает ошибку, но разрешение на его случай отличается от –

ответ

16

Причина ошибки в том, что ваш JSON на верхнем уровне представляет собой массив, а не объект. Это покрывается GSON throwing "Expected BEGIN_OBJECT but was BEGIN_ARRAY"?.

Однако решение для JSON не будет работать, потому что у вас есть массив смешанных типов (объект и массив), а не массив одного типа объектов. Для этого вам нужно будет написать собственный десериализатор (см. The section of the Gson user's guide that covers this) или непосредственно использовать класс Gson JsonParser и извлечь данные из дерева разбора.

Edit от комментариев выше:

Если ты один создания JSON, он выглядит как то, что вы хотите, это массив BoxSearch объектов?

на основе вашего класса Java BoxSearch, вам нужно JSON структурированы как:

[ 
    { 
     "lat1" : 39.737567, 
     "lat2" : 32.7801399, 
     "long1" : -104.98471790000002, 
     "long2" : -96.80045109999998, 
     "boxes" : [ 
        { 
         "lat": { 
          "b": 38.88368709500021, 
          "d": 40.620468491667026 
         }, 
         "long": { 
          "b": -105.75306170749764, 
          "d": -104.675854661387 
         } 
        } 
        ] 
    } 
] 

Однако, как вы Boxes класс определяется не будет работать для этого. (Вы имели в виду их массив?). Как-он должен был бы выглядеть следующим образом:

class Boxes { 
    Box lat; 
    @SerializedName("long") 
    Box lon; 
} 

class Box { 
    String b; 
    String d; 
} 

Теперь у вас есть массив, содержащий один тип объекта (BoxSearch), который вы могли бы десериализации с:

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType(); 
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType); 

Если вы действительно не нужно массив из них, чтобы избавиться от внешнего массива и просто сделать:

gson.fromJson(json, BoxSearch.class); 
+0

Большое спасибо Брайан, эта небольшая настройка для json и все в порядке. Я бы проголосовал за этот ответ, но у меня нет «уличного кредита». Код работает как чемпион. В случае, если люди копируют и вставляют этот ответ, Box long; необходимо переименовать :-) – user2415153

+0

О, да, мне нужен массив. Еще раз спасибо. – user2415153

+0

@ user2415153 Я изменил код, чтобы он работал с '' long ''в JSON - см. Ответ сейчас :) Я этого не заметил, извините. Что касается аванповок - вы можете принять мой ответ;) и рад, что я мог бы помочь! –

13
Gson gson = new Gson(); 
gson.fromJson(jsonStr,YourClass.class); 

очень легко.

+0

это поможет мне преобразовать объект json, у которого есть список внутри. Я конвертирую строку json в Object.class – Ashkan

Смежные вопросы