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 数据类
从 php json 编码获取字符串到 android 目标 api23+