【问题标题】:Gson variable in class can be either a String or a List<Integer> [duplicate]类中的 Gson 变量可以是 String 或 List<Integer> [重复]
【发布时间】:2014-09-22 22:04:33
【问题描述】:

当对类使用 gson 时,类变量之一可以是字符串或列表。是否可以在不创建一个类具有 String 而另一个类具有 List 的全新类的情况下捕获并解决此问题?

这是一个类的例子:

public class JsonClass
{
    private List<Integer> range;

    public List<Integer> getRange() { return range; }
}

这仅在范围是带有整数的列表时才有效,但它也可以只是一个字符串。 gson 消息是:“预期为 STRING,但为 BEGIN_ARRAY”。

【问题讨论】:

  • Java 不允许两个方法具有相同的名称(和相同的参数类型)......因此,您必须通过将它们分成类来跟踪这两个实例,或者只保留不同的字段 @ 987654322@ 和 List&lt;Integer&gt; range 以及你的 getter 方法:public List&lt;Integer&gt; getRange()public String getStrRange()

标签: java gson


【解决方案1】:

我认为你做不到。字符串和列表是完全不同的东西。由于 Java 是强类型的,你应该创建一个新类来处理它的两种方式

【讨论】:

    【解决方案2】:

    你有两个问题。

    首先,如果您的代码不知道range 的类型,它将如何使用这个JsonClass。您可以将其声明为Object,但您必须每次都检查实例类型并进行强制转换。或者,您可以有两个变量,每个类型一个。但是,你如何处理另一个?你留下null吗?你放了一个默认值,空列表,空字符串?这些是您应该首先考虑的事情。

    其次,默认情况下,Gson 会查看字段的声明类型以反序列化 JSON。如果您将其声明为Object,它将使用一些已知的默认值。您可以做的是创建并注册一个TypeAdapter,它将包含反序列化 JSON 数组和 JSON 字符串的逻辑,具体取决于它找到的内容。

    我不推荐上述任何一种方法。我建议您尝试修复您收到的 JSON 以发送单一类型或根据一些外部信息将其映射到不同类型,即。不基于 JSON 本身。

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2011-09-11
      • 2014-02-22
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多