2015-04-03 67 views
1

解析JSON我有以下對象:GSON失敗,串空間

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; 
    } 
} 

我使用GSON庫序列化成JSON。當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,它非常好。

編輯:

問題的模糊性並未被忽視。我希望這是一個存在的問題。該應用程序是巨大的,這就是爲什麼要找出一個小的,可編輯的例子很困難,但我會盡我所能!

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發佈重現錯誤的代碼將有助於... – 2015-04-03 19:45:17

+0

我已通過代碼添加路由。感謝您的關注@AlexisC。 – christopher 2015-04-03 20:13:55

+0

很難重現。嘗試打印來自'updateState'函數的內容,但是基於你的輸入,'keyValueMap'包含'{Plaintext = {type = String,value = hello there},Key = {type = Number,value = 1},SINGLE_FUNCTION (我剛剛完成Map Map keyValueMap =(Map)new Gson()。fromJson(gson.toJson(o),Object.class);''){} = {value = 1-0}說實話,我不認爲它與GSON的問題(否則它會是一個非常尷尬的錯誤),但你的方式處理你的數據,或者用奇怪的非打印字符(誰知道?)。 – 2015-04-03 20:20:51

回答

2

我剛剛有這個相同的問題。問題是該字符是一個非破壞性空間,char(160)。如果您使用POSTMAN將其粘貼到請求的主體中,您將在視覺上看到字符(它們看起來像灰色圓點)。 Gson不喜歡他們。

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(這可能是您從Web服務器獲取字符串後的問題)。

+0

它不是爲我工作。 – Gaurav 2016-07-25 11:24:36

+0

也不適用於我,gson版本2.4 – Jezor 2016-08-08 02:39:45