【问题标题】:Gson deserialize with null int can't seems to work使用 null int 反序列化 Gson 似乎无法正常工作
【发布时间】:2012-01-07 20:28:24
【问题描述】:

当我在网络上下载数据时,有时它可以工作,有时它不能。 我的问题在于int: 运行时:“”

runtime 是一个 int,当我在它上面使用 gson 时会导致这个问题:

01-07 21:22:57.602: E/AndroidRuntime(2726): Caused by: java.lang.NumberFormatException: Invalid int: ""

我尝试了一些 if 语句,但它不起作用。

public int getRuntime() {
    if(Integer.valueOf(runtime)==null){
        return 0;
    }else{
        return runtime;
    }
}

甚至

public int getRuntime() {
    if(Integer.valueOf(runtime).equals(null)){
        return 0;
    }else{
        return runtime;
    }
}

但没有任何效果。

【问题讨论】:

  • 您似乎不明白什么是异常,或者如何处理它们:docs.oracle.com/javase/tutorial/essential/exceptions 提示:无论runtime 是什么,它都不能转换为int。从您发布的内容来看,它看起来像一个空的String
  • 但是当数据工作时它是一个数字而不是一个字符串,这很奇怪。
  • @Tsunaze JSON总是是一个字符串,数字只是文本编码的。就像您在此处看到的数字 1234(在我的评论中 :))不是数字,而是可以解析为数字的字符串。
  • 你说得对。我只是把 String 而不是 int。

标签: java android null int


【解决方案1】:

Integer.valueOf() 需要一个表示整数的字符串。用空字符串调用它会lead to an exception。您需要在将字符串解析为整数之前对其进行测试:

int runtime;
if ("".equals(string)) {
    runtime = 0;
}
else {
    runtime = Integer.parseInt(string);
}

或者,如果字符串不是有效整数,则始终希望运行时为 0,则捕获异常:

try {
    runtime = Integer.parseInt(string);
}
catch (NumberFormatException e) {
    runtime = 0;
}

现在,是gson为你解析字符串,而这个字符串并不总是整数,那么runtime字段不应该是int,而是String。而且你应该自己去解析,如上图。

鉴于您的问题,在尝试使用 gson 和 android 做任何事情之前,您应该学习 Java 语言的基础知识。您似乎不了解 Java 中的类型系统以及异常是什么。阅读http://docs.oracle.com/javase/tutorial/java/nutsandbolts/

【讨论】:

    【解决方案2】:

    将运行时作为字符串处理,在要反序列化的类中将其声明为字符串。

    然后像这样使用 gson 将正确处理空值

    Gson gson = new GsonBuilder().serializeNulls().create();
    

    这在序列化时也有效,通常如果值为 null,它不会在 json 中放入任何要序列化的内容。

    【讨论】:

      【解决方案3】:

      您似乎不明白什么是异常,或者如何处理它们:

      http://docs.oracle.com/javase/tutorial/essential/exceptions

      public int getRuntime() {
      
          int i = 0;
      
          try {
              i = Integer.valueOf(runtime);
          } catch (NumberFormatException e) {
              System.out.println("runtime wasn't an int, returning 0");
          }
      
          return i;
      
      }
      

      提示:无论运行时是什么,都不能转换为 int。从您发布的内容来看,它看起来像一个空字符串

      【讨论】:

        【解决方案4】:

        您需要先检查runtime,例如if( runtime.isEmpty() ) 或更好 - 使用 apache commons lang - if( StringUtils.isBlank( runtime )) 或捕获被抛出的 NumberFormatException

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-04
          • 2012-05-06
          • 2013-02-17
          • 2017-10-09
          相关资源
          最近更新 更多