2014-02-04 2 views
6

Я разбираю простой объект JSON с Gson. Я хочу, чтобы он выдавал некоторую ошибку, когда имя ключа дублируется. Например.Сделать Gson исключение при разборе JSON с дублированным ключом

{ 
    a: 2, 
    a: 3 
} 

В моем случае, Gson анализирует такой JSON и устанавливает значение 3. Я хочу, чтобы он сделал какое-то исключение.

Я знаю, что могу разобрать JSON как карту, а затем Gson выдает исключение в таком случае, но только если дублированный ключ не вложен в карту. Если у меня есть, например, JSON как это:

{ 
    a: 2, 
    b: { 
    dup: 1, 
    dup: 2 
    } 
} 

Тем не менее, он обрабатывается без каких-либо исключений и у меня есть только один «DUP» со значением 2.

Могу ли я каким-то образом настроить Gson бросить ошибку в таком случае? Или иметь дублированные записи в JsonObject инстанции, так что я могу обнаружить это сам (но я сомневаюсь, что, как это было бы недействительным JsonObject)

Возпроизводимо пример

String json = "{\"a\":2, \"a\":3}"; 
Gson gson = new Gson(); 
JsonObject jsonObject = gson.fromJson(json, JsonObject.class); 
System.out.println(jsonObject); 

печатает

{"a":3} 
+0

Можете ли вы добавить [SSCCE] (http://sscce.org/), чтобы мы могли реплицировать то, что вы описываете? – dimo414

+0

@ dimo414 Я сделал это для них в моем понимании. –

+0

Мне кажется, вы должны иметь другой конец, чтобы отправить действительный JSON. –

ответ

3

1) Вы можете немного изменить источник gson. Это всего лишь предложение понять, как все работает. Я не советую вам использовать это в реальной/производственной среде.

Gson использует com.google.gson.internal.LinkedTreeMap при анализе строки json на JsonObject. Для проблем с тестированием вы можете скопировать этот класс в свой проект с тем же именем и именем пакета. И отредактируйте его метод put, чтобы не допускать дублирования ключей.

@Override 
    public V put(K key, V value) { 
    if (key == null) { 
     throw new NullPointerException("key == null"); 
    } 

    // my edit here 
    if(find(key, false) != null) { 
     throw new IllegalArgumentException("'" + key.toString() + "' is duplicate key for json!"); 
    } 

    Node<K, V> created = find(key, true); 
    V result = created.value; 
    created.value = value; 
    return result; 
    } 

2) Еще один чистый раствор для определения пользовательских классов, которые собираются сопоставить ваши JSon строк. Затем напишите свой заказ TypeAdapters

3) Сделайте это с помощью Deserializer? Я не думаю, что это возможно. Если вы попытаетесь использовать его, вы увидите, что у вас уже есть jsonObject, в котором ваши дубликаты ключей обрабатываются как один.

+0

Да, я уже думал о TypeAdapter, и я попробую это. – amorfis

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