簡體   English   中英

GSON 無法使用字符串空間解析 JSON

[英]GSON fails parsing JSON with string space

我有以下對象:

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,它非常好。

編輯:

問題的含糊性並沒有被忽視。 我希望這是一個存在的問題。 應用程序是巨大的,這就是為什么很難撬出一個小的、可編譯的示例,但我會盡我所能!

好的。 所以首先,下面的 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); 是異常最初發生的地方。

因此,經過一些討論,以下解決方法有效:

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)使解析器的限制更少。

查看文檔,您的 Json 字符串中不存在setLenient(true)禁用的所有限制,除了第一個(這可能是問題,因為您是從網絡服務器獲取字符串)。

我剛剛遇到了同樣的問題。 問題是字符是一個不間斷的空格,char(160)。 如果您使用 POSTMAN 將其粘貼到請求正文中,您將能夠在視覺上看到字符(它們看起來像灰點)。 Gson 不喜歡他們。

這對我有用

  Gson gson = new Gson(); 
  Map keyValueMap = (Map) gson.fromJson(gson.toJson(s.trim()), Object.class);

我在這個 JSON 中遇到了同樣的錯誤:

{“id”:“”,“title”:“Hello SiteCore”,“description”:“This is the body text from SiteCore”,“type”:“Information”,“displayType”:“Banner”}

解析器指向第一個空格之后的字符。

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 26 path $.null

經過大量搜索和一些額外的眼睛,我們發現 JSON(來自 Sitecore 數據庫)是用而不是"創建的。

使用通常的 Gson 代碼將所有字符"更改為"解決了我的問題:

    @JvmStatic
    fun convertFromJsonString(data: String): Message? {
        if (data.isEmpty())
            return null
        return Gson().fromJson(data, Message::class.java)
    }

希望這對未來的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM