为什么JSONObject.optString会为我的字符串添加垃圾?

时间:2011-08-12 18:33:04

标签: android json

我从json开始:

{
    "Key1" : "Value1",
    "Key2" : "Value2"
}

然后我用字符串对这个json进行硬编码:

String json = "{ \"Key1\" : \"Value1\", \"Key2\" : \"Value2\" }";

接下来我尝试解析json:

JSONObject content = null;
try {
    content = new JSONObject(json);
} catch (JSONException e) {
    e.printStackTrace();
    return null;
}       

String key1 = content.optString("Key1", null);

如果我查看通过调用JSONObject创建的hashmap,它看起来是正确的:

{Key2=Value2, Key1=Value1}

但是当我在调试器中查看字符串key1的值时,我得到了这个:

[V, a, l, u, e, 1, U, U, U, U, U, U, U, U, U, U]

其中U似乎是unicode字符25A1(白色方块)。

我也尝试过通用get(“Key1”)方法,将结果转换为字符串,我得到相同的行为?!

2 个答案:

答案 0 :(得分:3)

我没有看到您的代码存在问题,因为这种轻微修改似乎有效:

public static void main(String[] args)
{
    String json = "{ \"Key1\" : \"Value1\", \"Key2\" : \"Value2\" }";

    JSONObject content = null;
    try
    {
        content = new JSONObject(json);
    }
    catch (JSONException e)
    {
        e.printStackTrace();
        return;
    }

    String key1 = content.optString("Key1", null);
    System.out.print(key1 + "end!");
}

控制台输出显示:Value1end!

在查看调试器中的代码时,我看到了:

enter image description here

如果我猜测,可能只是调试器用于保存String的额外缓冲区空间。您是否尝试过查看代码认为的内容?

"Value1".equals(key1); //should return true if everything is working correctly.

答案 1 :(得分:0)

optString(java.lang.String key)获取与密钥关联的可选字符串。

你应该使用

getString(java.lang.String key)获取与密钥关联的字符串。

或者我错过了什么?

更多信息:http://www.json.org/javadoc/org/json/JSONObject.html