当前位置: 首页 > 知识库问答 >
问题:

JSON jsonObject。optString()返回字符串“null”

崔绍辉
2023-03-14

我正在开发一个使用JSON进行服务器通信的Android应用程序,当我试图解析我的json文件时,我遇到了一个奇怪的问题。

这是来自服务器的json

{
    "street2": null,
    "province": null,
    "street1": null,
    "postalCode": null,
    "country": null,
    "city": null
}

我通过调用字符串City=address来获取City的值。我的地址Json对象上的optString(“city”,“”)。对于这种情况,我希望城市是空的(这就是optString在这里的目的,不是吗?)但实际上它包含字符串“null”。因此,进一步的null或isEmpty检查将返回false,因为字符串包含文本。如果我呼叫地址。isNull(“city”)返回正确的true。只有OPT字符串失败。

我在Google或Stackoverflow上找不到任何解决这个问题的东西。我真的不明白它是如何发生的,因为我认为optString会完全符合我的预期。有人知道这里出了什么问题吗?

共有3个答案

缪英锐
2023-03-14

只需将“null”替换为“code>”,即可摆脱这种情况。

String city = address.optString("city").replace("null", "");
须曜文
2023-03-14

您基本上有两种选择:

1) 发送具有空值的JSON负载

{
"street2": "s2",
"province": "p1",
"street1": null,
"postalCode": null,
"country": null,
"city": null
}

您必须检查空值并相应地分析它们:

private String optString_1(final JSONObject json, final String key) {
    return json.isNull(key) ? null : json.optString(key);
}

2) 不要发送带有null值的密钥,直接使用optString(key,null)(应该可以节省带宽)。

{
"street2": "s2",
"province": "p1"
}
葛阳
2023-03-14

并非只有你一个人会遇到这个问题,挠头,想“他们真的是这个意思吗?”根据AOSP的一个问题,谷歌工程师确实认为这是一个bug,但他们必须与组织兼容。json实现,甚至与bug兼容。

如果您仔细想想,这是有道理的,因为如果在其他Java环境中运行的使用相同库的相同代码在Android中的行为不同,那么在使用第三方库时会出现重大的兼容性问题。即使意图是好的,并且它确实修复了bug,它也会打开一个全新的蠕虫罐头。

根据AOSP问题:

这种行为是有意的;我们竭尽全力与错误兼容org.json.现在已经修复了,不清楚我们是否也应该修复我们的代码。应用程序可能已经开始依赖这种错误行为。

如果这让您感到难过,我建议您通过使用不同的机制来测试null(如json)来解决问题。isNull()。

这里有一个简单的方法可以帮助您:

/** Return the value mapped by the given key, or {@code null} if not present or null. */
public static String optString(JSONObject json, String key)
{
    // http://code.google.com/p/android/issues/detail?id=13830
    if (json.isNull(key))
        return null;
    else
        return json.optString(key, null);
}
 类似资料:
  • GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串

  • 问题内容: 我正在开发一个使用JSON进行服务器通信的Android应用,当我尝试解析json文件时遇到了一个奇怪的问题。 这是我来自服务器的json 我通过调用地址Json-object 获得City的价值。对于这种情况,我期望为空(这是optString的意思吗?),但实际上它包含字符串“ null”。因此,进一步的null或isEmpty- checks将返回false,因为String包含

  • 问题内容: 我有一个返回字符串的Java实例方法,我正在C ++中通过JNI调用此方法。我写了以下代码: 如何获取字符串并将其转换为const char *? 我的程序在访问冲突为0x00000000的最后一行崩溃。returnString不是NULL。 问题答案: 根据,最后一个参数是的指针。 更改 至 或者更好的是,返回一个 我建立了一个类似的简单示例,到目前为止,代码看起来还不错。 虽然,有

  • 问题内容: 我犹豫要问这个问题,因为它看起来很奇怪。但不管怎么说。以防万一有人已经遇到了相同的问题…文件系统功能(fopem,file,file_get_contents)对于http://包装器表现得很奇怪 它似乎有效。 没有提出错误 。fopen()返回资源。 它不会为所有肯定有效的网址返回任何数据(例如)。 文件返回空数组,file_get_contents()返回空字符串,fread返回f

  • 我有一个Java实例方法,它返回一个字符串,我通过C中的JNI调用这个方法。我编写了以下代码: 如何获取字符串并将其转换为常量字符*? 我的程序在最后一行崩溃,访问冲突为0x00000000。returnString不为NULL。

  • 我很难在我的android应用程序中处理编辑文本的输入。我正在输入小数点值,我已经处理了小数点,但是当我移除EditText的所有内容时,我的应用程序崩溃了。我在EditText小部件的onTextChanged函数中检查了NULL或“”的值,但是这个值被超越了。以下是我的相关功能: 我的logcat: 我担心的是我被告知无效的双倍是“”,然而我正在检查这样的事件... 谢谢你的帮助!