首页 > 解决方案 > 尝试使用 Java (Android Studio) 从 String 创建 JSONObject

问题描述

我遇到了一个问题,我尝试将序列化的 json 字符串解析为 JSONObject,以便稍后检索另一个对象 PetFedInfo 的键值。我从我的 android 应用程序调用 ASP.NET Web API,字符串成功返回。

这是我从 asp.net api 服务器解析结果的代码:

    JSONObject jsonObj = new JSONObject();
    try {

        String stringFromServer =  PostHTTP(Constants.POST_PET_GETFEDINFO,jObj);
        Log.v("stringFromServer",stringFromServer);
        Log.v("directCallResult",PostHTTP(Constants.POST_PET_GETFEDINFO,jObj));
        Log.v("actualString","{\"petName\":\"nn\",\"lastFedTime\":\"\"}");

        jsonObj = new JSONObject("{\"petName\":\"nn\",\"lastFedTime\":\"\"}");
        Log.v("jsonObjFromManualString",jsonObj.toString());
        jsonObj = new JSONObject(PostHTTP(Constants.POST_PET_GETFEDINFO,jObj));
        Log.v("jsonObjFromDirectCall",jsonObj.toString());

    } catch (JSONException e) {
        e.printStackTrace();
    }

在调试模式下运行应用程序后,当我尝试创建 JSONObject 时,来自实例“stringFromServer”(记录为“stringFromServer”)的字符串会引发错误:

org.json.JSONException: Value {"petName":"mm","lastFedTime":""} of type java.lang.String cannot be converted to JSONObject
        at org.json.JSON.typeMismatch(JSON.java:112)
W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:168)
        at org.json.JSONObject.<init>(JSONObject.java:181)
        at com.FeedMyPet.helper.WebRequestManager$2.run(WebRequestManager.java:102)

而我手动输入的字符串(记录为“actualString”)成功地创建了 JSON 对象。我已经使用 Log.v 将所有字符串值打印到控制台,它们几乎具有相同的输出

V/stringFromServer: "{\"petName\":\"v\",\"lastFedTime\":\"\"}"
V/directCallResult: "{\"petName\":\"v\",\"lastFedTime\":\"\"}"
V/actualString: {"petName":"nn","lastFedTime":""}

我已经查看了 JSONObject 的构造,它接受一个字符串:

    public JSONObject(String json) throws JSONException {
        this(new JSONTokener(json));
    }

对于为什么使用引号(没有对象?)的序列化对象成功创建对象而 String 实例不能成功创建对象,我有点迷茫。如何让 String 对象与“actualString”的结果相匹配?

有人可以指出我正确的方向吗?

标签: javaandroidjson

解决方案


尝试清理从服务器接收到的字符串。可能会添加一些隐藏字符。

看看这个链接https://stackoverflow.com/a/15469907/578855

您也可以尝试用这个替换双引号

json=json.replace("\\\"","'");


推荐阅读