2013-12-13 6 views
2

Я использую в своем проекте библиотеку GSON, все в порядке, но теперь я застрял в проблеме, когда мне нужно использовать собственный десериализатор на неуказанные значения.Gson parse unquoted value

У меня есть следующее значение, и необходимо разобрать из JSON:

[[ "район", "=", field_name], [ "имя", "ILIKE", "имя пользователя"]]

Мне нужно разобрать некотируемые значения с пользовательской десериализации, в класс-оболочку, как:

public class StringField { 
    private String value; 

    public String getValue() { 
     return value; 
    } 

} 

И значение будет иметь «field_name» в виде строки.

+1

Я не уверен, насколько ясно, что ваша проблема, и что вам нужно. –

ответ

0

Я решила эту проблему лет назад по-другому (извините за отсроченного). Написал символический класс препроцессора, который заменяется ярлыками regexp, такими как field_name с фактическими значениями из модели, а затем анализируется json.

2

Проблема в том, что данные не действительны JSON.

JSON делает не разрешает такие строки «неупорядоченного значения», такие как field_name, а также Gson. Либо зафиксируйте вход так, чтобы он был действительным JSON (возможно "$field_name$") - или используйте инструмент (т. Е. Не Gson), который может справиться с текстом не JSON, похожим на JSON.

Эта ситуация не могут быть исправлены с Custom Deserialization, поскольку данные даже не правильно разобран на JSon лексем: Gson сгенерирует исключение, как инвалиду/не JSON встречается.

По меньшей мере для этого потребуется создать под заказJsonReader реализация, которая может читать «barewords» как строки. Однако это проблематично, потому что JsonReader не соответствует каким-либо специализированным интерфейсам (поэтому он должен быть подклассифицирован, oops!) И является окончательным (поэтому он не может быть подклассифицирован, oops!). Таким образом, если вы не захотите редактировать источник библиотеки Gson, это невозможно.

2

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

package stackoverflow.questions; 

import java.util.List; 

import com.google.gson.*; 

public class Q20557131 { 

    public static void main(String[] args){ 

     String json = "[[\"county\",\"=\", field_name], [\"name\", \"ilike\", \"username\"]]"; 
     Gson g = new Gson(); 
     List outerList = g.fromJson(json, List.class); 


     List innerList = (List) outerList.get(0); 
     for(Object o: innerList) 
     System.out.println(o.getClass()); 

    } 
} 

По умолчанию Gson 2.2.4 снисходительно, даже если имеет мягкий набор свойств ложь, от documentation

настроить этот анализатор будет либеральным в том, что он принимает. По умолчанию этот анализатор строг и принимает только JSON, как указано в RFC 4627. Настройка анализатору снисходительны заставляет его игнорировать следующие синтаксические ошибки:

....

Строки, которые неупомянута или «сингл цитировал.

...

даже если документация указывает, что свойство является ложным по умолчанию в исходном коде JsonReader#fromJson:

public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException { 
    boolean isEmpty = true; 
    boolean oldLenient = reader.isLenient(); 
    reader.setLenient(true); <-- always true 
    try { 
     reader.peek(); 
     isEmpty = false; 
     TypeToken<T> typeToken = (TypeToken<T>) TypeToken.get(typeOfT); 
     TypeAdapter<T> typeAdapter = getAdapter(typeToken); 
     T object = typeAdapter.read(reader); 
     return object; 
    } catch (EOFException e) { 
    ...