2013-09-11 3 views
2

Я пытаюсь проанализировать данные json с помощью gson-библиотеки Google. Но данные json не ведут себя хорошо.Пустой объект json вместо null, когда нет данных -> как десериализовать с помощью gson

Это выглядит так, когда все в порядке:

{ 
    "parent": { 
     "child_one": "some String", 
     "child_two": "4711", 
     ... 
    } 
} 

child_one должен быть разобрано как String, child_two в int. Но иногда один из детей не имеет значения, что приводит к пустому объекту вместо null, как это:

{ 
    "parent": { 
     "child_one": "some String", 
     "child_two": {}, 
     ... 
    } 
} 

я не имею доступа изменять подачу JSon, поэтому мне приходится иметь дело с ним во время десериализации. Но я здесь потерялся. Если я просто позволю ему разобрать, то второй случай даст мне JsonSyntaxException.

Я думал об использовании пользовательского JsonDeserializer. Сделайте что-нибудь вроде проверки каждого элемента, если это JsonObject, и если да, проверьте, есть ли entrySet.isEmpty(). Если да, удалите этот элемент. Но я не знаю, как выполнить итерацию ...

ответ

6

Не можете ли вы просто заменить {} на NULL, прежде чем передавать его в GSON?

+0

'null' все равно будет недействительным, так как OP должен разбираться с' int'. –

+2

@Adassko Это была правильная идея. Я просто должен был сделать это с данными перед тем, как передать его: 'json.toString(). Replace (" {} "," null ");' – msal

+0

@SotiriosDelimanolis 'null' в порядке, поскольку gson обрабатывает разбор. :) – msal

1

Сделайте TypeAdapter<String> «ы read метод как это:

public String read(JsonReader reader) throws IOException { 
    boolean nextNull = false; 
    while (reader.peek() == JsonToken.BEGIN_ARRAY || reader.peek() == JsonToken.END_ARRAY) { 
     reader.skipValue(); 
     nextNull = true; 
    } 
    return nextNull ? null : reader.nextString(); 
} 

Объясните: когда следующий маркер [ или ], просто пропустите его и вернуть нуль.

Если вы замените все [] на null, используйте String#replaceAll непосредственно, некоторые реальные строки также могут быть заменены, это может вызвать некоторые другие ошибки.

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