我需要将json字符串转换为java对象,并将其显示为long。json字符串是一个固定的长数字数组:
{numbers
[ 268627104, 485677888, 506884800 ] }
要转换的代码在所有情况下都能正常工作,但以0结尾的数字除外。它将这些数字转换为科学记数法数字格式:
public static Object fromJson(HttpResponse response, Class<?> classOf)
throws IOException {
InputStream instream = response.getResponseInputStream();
Object obj = null;
try {
Reader reader = new InputStreamReader(instream, HTTP.UTF_8);
Gson gson = new Gson();
obj = gson.fromJson(reader, classOf);
Logger.d(TAG, "json --> "+gson.toJson(obj));
} catch (UnsupportedEncodingException e) {
Logger.e(TAG, "unsupported encoding", e);
} catch (Exception e) {
Logger.e(TAG, "json parsing error", e);
}
return obj;
}
实际结果:Java对象:268627104、485677888、5.068848E+8的规定
请注意,最后一个数字被转换为科学记数法格式。有人能建议可以做些什么来解决它,防止它或撤销它吗?我使用的是Gson v1.7.1
9条答案
按热度按时间jdzmm42g1#
如果您可以选择序列化为String,则可以使用以下命令配置GSON:
这将产生类似以下的结果:
kdfy810k2#
另一种解决方法是使用JsonParser类。这将返回Gson对象表示(JsonElement)而不是用户定义的类,但避免了转换为科学记数法的问题。
程式码输出:
gdx19jrr3#
我遇到过类似的问题,它不仅将整数转换为双精度,而且实际上会丢失某些长数字的精度,如related question中所述。
我跟踪了
ObjectTypeAdapter
的read
方法的转换,具体来说:也许可以为
Object
插入一个修改过的TypeAdapter
,但我无法让它工作,所以我只是将read
方法(Object read(JsonReader in)
)复制到我自己的代码中,并将上面的代码行修改为:我希望Gson默认这样做。
然后,我将其他连接部分放入一个helper方法中,如下所示:
现在我调用
parse(r)
,而不是new Gson().fromJson(r, Object.class)
。这对我来说很好,因为我希望能够解析任何结构的json数据,但是如果你有一个特定的目标类,你可能只需要在该类的成员中消除
Object
的出现。a6b3iqyw4#
得到了同样的问题,经过一些调查后,这里是我发现的。
行为:
对于没有小数部分的数字,
Gson
会将其转换为Double
,对于没有小数部分的数字,
Jackson
会将其转换为Integer
或Long
,具体取决于数字的大小。可能的解决方案:
Gson
的返回值从Double
显式转换为Long
。Jackson
。我更喜欢这个。
代码-
Jackson
的测试分析数字测试.java:
数字.json:
如何运行:
Jackson
和TestNG
。numbers.json
放在与ParseNumberTest.java
相同的封装中。输出:
dwthyt8l5#
不聪明,但仍然工作的方法是在开始和结束时加上“数字.然后在处理完毕后,将其删除。
icnyk63a6#
我们可以使用下面的代码解决数字长:
ws51t4hk7#
如果您需要将它们作为String,最好的解决方案是在转换之前强制属性用单引号引起来。
执行如下更改:
wyyhbhjk8#
给定上面的
value:Any
属性,我发现Gson遇到1
(而不是"1"
)的JSON值并且不能推断显而易见的事实是可疑的:1
是一个Int
。Gson会将整数值转换为双精度值1.0
。如果上述
value
属性的类型为Float
或Double
,Gson * 应该 * 仅将JSON值从1
转换为1.0
。当Gson遇到类型为Any
的属性时,它应该(非常简单)从接收到的JSON值推断类型。更喜欢通过将传入的整数值强制转换为Double来实际损坏这些值,这会立即导致异常。对于Gson解析器的这种特性,我找不到合理的解决方案。因此,我不得不在使用Gson后手动将所有双精度值转换回int值,或者为Gson实现我自己的通用自定义类型适配器。这两种选择都没有吸引力。
hmmo2u0o9#
我没有找到解决gson将以0结尾的数字格式化为科学记数法的方法,而是使用了一种变通方法,将这种科学记数法转换为一个双精度数,并使用逗号进行格式化。“value”是json字符串。
这并没有回答所提出的问题,而是一个附加步骤,用于解决该问题,以显示系统所需的数字。