Android 应用的 JSON 编码数据

Posted

技术标签:

【中文标题】Android 应用的 JSON 编码数据【英文标题】:JSON encoding data for Android app 【发布时间】:2012-12-18 06:50:55 【问题描述】:

我正在尝试将 JSON 数据从 php 脚本发送到 android 应用,而 php 脚本的输出与 Java 应用所期望的不同。

$data['sample']['txt']="hello world";
echo json_encode($data) // "sample":"txt":"hello world"
//above is incorrect, need sample : [txt:"hello world"]

不正确的格式会导致以下 Java 异常:

org.json.JSONException: Value "txt":"hello world" at sample of type org.json.JSONObject cannot be converted to JSONArray.  

是否有我遗漏的 PHP json_encode 参数,或者可以正确编码的替代方法?

异步任务的Java代码:

public class RetrieveData extends AsyncTask<List<? extends NameValuePair>, Integer, List<String>> 

    protected List<String> doInBackground(List<? extends NameValuePair>... postData) 
        InputStream is = null;
        List<String> result = new ArrayList<String>();

        try 
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://192.168.72.2:10088/droid_test/test.php");
            httppost.setEntity(new UrlEncodedFormEntity(postData[0]));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) 
                    sb.append(line + "\n");
            
            reader.close();
            is.close();

            JSONObject JSONobj=new JSONObject(sb.toString());
            JSONArray JSONarr=JSONobj.getJSONArray("sample");

            for(int i = 0 ; i < JSONarr.length() ; i++)
                result.add(JSONarr.getJSONObject(i).getString("txt"));
            

            
        catch(Exception e) 
            result.add("ERROR "+e.toString());
        

        return result;
    

    protected void onPostExecute(List<String> result) 
            getHTTP(result);
    


getHTTP(result) 只是将值设置为 TextView,这是显示错误的位置。 (或者如果我对 echo 语句进行硬编码,则为响应)

解决方案:

JSONObject JSONobj=new JSONObject(sb.toString());
JSONObject JSONarr=JSONobj.getJSONObject("sample"); // made object per @digitaljoel's suggestion

for(int i=0; i<JSONarr.length(); i++) 
    result.add(JSONarr.getString("txt")); // getting a String, not another array/object *duh*

【问题讨论】:

问题是您没有正确使用 java 库。当然,你可以使用 php 代码来解决问题。 变体 with 引号是正确的 JSON 我怀疑 Android 弄错了。 我的想法是问题更多的是对缺少方括号的抱怨。当我用 echo "sample : [txt:\"hello world\"]"; 替换 echo 语句时Android 应用接受了这些值。 你是对的,这是缺少方括号的问题。有关详细信息,请参阅我的答案。您应该了解 JSON 的格式,以便将来轻松调试此类问题。这是一个简单的入门。 guide.couchdb.org/draft/json.html 【参考方案1】:

解决问题的一种方法是执行以下操作...

<?php
    $json = preg_replace('/"([a-zA-Z]+[a-zA-Z0-9]*)":/', '$1:', json_encode($whatever));
?>

虽然我怀疑问题出在你的 Java/Dalvik 代码上,因为你得到的 JSON 是完全合法的。查看JSON-RPC 2.0 Specification 中的示例。

this page 上还有一个特定的 Android 示例,也符合规范:

"hash":"attribute":"123","attribute":"value", …

【讨论】:

【参考方案2】:

您展示的两个 JSON 示例都是有效的 JSON,这只是您的映射在每一端的问题。

您的 java 代码期望“样本”包含对象的集合(列表或数组),其中每个对象都有一个 txt 字段。这就是为什么它在 JSON 中的对象值周围有 []。

您可以更改 java 端的映射以仅期望 sample 的单个值,或者您可以更改 php 代码,使 $data['sample'] 是一个具有单个元素的数组,该数组具有 'txt' = "你好,世界”。

如果您在 java 端包含映射,我可以提供帮助。如果您想在 php 方面修复它,我相信一些 php 大师可以提供帮助。

编辑:

JSONArray JSONarr=JSONobj.getJSONArray("sample"); 正在请求一个数组。将其更改为 JSONObject 即可。

【讨论】:

很高兴您可以使用它,并感谢您使用有效的解决方案进行更新。你知道......对于孩子们!顺便说一句,如果您要使用 JSON 做的不仅仅是非常琐碎的工作,我建议您使用像 Jackson 这样的 JSON 映射库。

以上是关于Android 应用的 JSON 编码数据的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云函数 - 对象不能用 JSON 编码 - Kotlin 数据类

Python 请求编码 POST 数据

从 php json 编码获取字符串到 android 目标 api23+

django-关于JSON编码格式的异常处理

如何从增加版本号的 Android Studio 中导出 apk

属性的 CNContact 编码