【问题标题】:Gson conversion of a simple string fails with exception简单字符串的 Gson 转换失败并出现异常
【发布时间】:2020-04-30 23:17:33
【问题描述】:

我需要根据函数的返回类型将 json 字符串转换为特定类型。 json 字符串也可以是纯字符串。我在使用 gson.fromJson 方法转换字符串时遇到问题。

如果字符串包含空格,为什么在 gson.fromJson 中会抛出异常?我该如何解决这个问题?

import java.lang.reflect.Method;

import com.google.gson.Gson;

class Trial {
    Object retu() {
        return "BEVERLY OUTLAW";
    }
}

public class sample {
    public static void main (String args[]) {
        Gson gson = new Gson();
        Trial obj = new Trial();

        Method func = obj.getClass().getDeclaredMethods()[0];
        Object o = gson.fromJson("beverlyoutlaw", func.getGenericReturnType());
        System.out.println(o); ---> this prints beverlyoutlaw
        o = gson.fromJson("beverly outlaw", func.getGenericReturnType()); ---> This throws an exception!
        System.out.println(o);
    }
}

【问题讨论】:

  • 答案很简单:单个字符串是否是有效的 Json 是有问题的,因为两个不同的 RFC 指定 Json 对此有所不同(更多:stackoverflow.com/questions/13318420/…)。 Gson 不认为字符串是有效的 Json,需要最外层的元素是对象或数组。
  • 那为什么它可以在没有空格的字符串上工作呢?
  • 我不得不承认,我错过了那部分。你试过gson.fromJson("\"beverly outlaw\"", ...)吗?我很确定 Json 中的字符串需要用引号括起来,即使没有空格,所以即使在没有它们的情况下解析字符串也已经是“尽最大努力”了。
  • 是的,行得通!
  • 您在这里有点想打破常规:传递给fromJson 的非JSON 字符串,通过getGenericReturnType 检索的目标类型。你想达到什么目的?

标签: java gson


【解决方案1】:

Json 中的字符串需要用引号括起来。那就是 - 在 Json 本身中!

"beverlyoutlaw""beverly outlaw" 都不在字符串中包含引号 - 引号只是 Java 字符串文字的一部分。

显然 Gson 不会对没有空格的字符串强制执行此操作 - 但对于带有空格的字符串,这是绝对必要的。

要解决您的问题,请使用o = gson.fromJson("\"beverly outlaw\"", func.getGenericReturnType());

【讨论】:

  • 这不太正确对于带有空格的字符串,但这是绝对必要的。抛出异常是因为 Gson 没有使用完整的输入字符串,而不是因为它认为的字符串包含空格。
  • 你是对的,@SotiriosDelimanolis。但是最后它的意思是一样的,只是反过来:如果 Gson 在停止解析字符串时没有消耗整个输入,但是你的整个 json 是一个带空格的单个字符串,那么需要引号顺序让 Gson 将您的 Json 完全解析为那个确切的单个字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2017-10-02
相关资源
最近更新 更多