2015-04-03 4 views
1

У меня есть следующий объект:GSON удалось выполнить синтаксический анализ JSON шпагатом пространства

public class ParameterWrapper<T> { 

    private String type; 

    private T value; 

    public ParameterWrapper(String type, T value) { 
     this.type = type; 
     this.value = value; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public T getValue() { 
     return value; 
    } 

    public void setValue(T value) { 
     this.value = value; 
    } 
} 

Я сериализации в JSON с помощью библиотеки Gson. Когда value содержит строку без пробелов, она отлично работает. Когда value содержит строку с пробелами, я вижу следующее исключение:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: незавершенная объект в строке 1 колонки 28

Для следующего JSON:

{"Plaintext":{"type":"String","value":"hello there"},"Key":{"type":"Number","value":"1"},"SINGLE_FUNCTION":{"value":"1-0"}} 

Однако со следующим:

{"Plaintext":{"type":"String","value":"hellothere"},"Key":{"type":"Number","value":"1"},"SINGLE_FUNCTION":{"value":"1-0"}} 

JSON успешно разбирается. Это известная проблема? Я запускал JSON через валидатор, и все в порядке.

Edit:

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

OKAY. Таким образом, во-первых, ниже JSON будет отправить на мой контроллер:

@RequestMapping("/update-state") 
public 
@ResponseBody 
String updateState(@RequestParam(value = "algorithmId") String algorithmId, 
        @RequestParam(value = "state") String state) throws InvalidParameterException { 

    Algorithm algorithm = algorithmService.getAlgorithmById(Integer.parseInt(algorithmId)); 
    algorithm.execute(executorService.parseAlgorithmState(state)); 

    return gsonBuilder.toJson(algorithm.getState().getParameterMap()); 
} 

На призыв к parseAlgorithmState(state), она движется вниз к этому методу:

@Override 
public AlgorithmState parseAlgorithmState(String json) throws InvalidParameterException { 
    Gson gson = new Gson(); 
    Map keyValueMap = (Map) gson.fromJson(json.trim(), Object.class); 
    ... 

Линия Map keyValueMap = (Map) gson.fromJson(json.trim(), Object.class); где исключение первоначально происходит.

+1

Не могли бы вы показать, как вы сериализуете/десериализуете данные? Этот вопрос кажется странным. Я создал небольшую программу на основе вашего проблемного ввода, и она отлично работает. Вы можете проверить его там: https://gist.github.com/alexcrt/d898d5780cf5da4b0bbd Проводка кода, который воспроизводит ошибку, поможет ... –

+0

Я добавил маршрут через код. Спасибо за внимание @AlexisC. – christopher

+0

Трудно воспроизвести. Попробуйте напечатать то, что исходит из вашей функции «updateState», но снова основано на вашем вводе. «KeyValueMap» содержит '{Plaintext = {type = String, value = hello there}, Key = {type = Number, value = 1}, SINGLE_FUNCTION = {значение = 1-0}} 'в конце (я только что сделал« Map KeyValueMap = (Карта) новый Gson(). fromJson (gson.toJson (o), Object.class); ').Честно говоря, я не думаю, что это проблема с Gson (иначе это было бы очень смущающей ошибкой), но с тем, как вы манипулируете своими данными, или со странными непечатаемыми персонажами (кто знает?). –

ответ

2

У меня только была эта проблема. Проблема состоит в том, что символ является неразрывным, char (160). Если вы вставляете это в тело запроса с помощью POSTMAN, вы визуально сможете видеть символы (они выглядят как серые точки). Гнос их не любит.

2

Таким образом, после некоторого обсуждения, следующий обходной путь работал:

Gson gson = new Gson(); 
JsonReader jr = new JsonReader(new StringReader(s.trim())); 
jr.setLenient(true); 
Map keyValueMap = (Map) gson.fromJson(jr, Object.class); 

setLenient(true) делает анализатор немного менее ограничительным.

Осмотрев документацию, все ограничения, которые setLenient(true) отключены, не указаны в вашей строке Json, кроме first one (что может быть проблемой, так как вы получаете строку с веб-сервера).

+0

его не работает для меня. – Gaurav

+0

Не работает и для меня, и для gson версии 2.4 – Jezor

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