GSON无法使用字符串空间解析JSON

时间:2015-04-03 19:02:21

标签: java 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);是最初发生异常的地方。

4 个答案:

答案 0 :(得分: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)使解析器的限制性降低一些。

查看文档{J}字符串中除了first one之外,{J}字符串中没有setLenient(true)禁用的每个限制(这可能是问题,因为您从Web服务器获取字符串)。< / p>

答案 1 :(得分:2)

我刚才有同样的问题。问题是角色是一个不间断的空间,char(160)。如果您使用POSTMAN将其粘贴到请求正文中,您将在视觉上能够看到字符(它们看起来像灰点)。 Gson不喜欢他们。

答案 2 :(得分:0)

这对我有用

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

答案 3 :(得分:0)

此JSON出现相同的错误:

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

解析器指向第一个空格之后的char。

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

希望这对以后的人有帮助。