为什么我们在android中使用JSON?
我正在研究JSON,并且我意识到我可以如何使用它以及它如何工作。但是我不明白,为什么我们将它用在我们的项目和程序中。 如果你们中的一个人为我描述原因,我会很高兴......
谢谢回答 ...
因此,您将学习如何在Android中使用JSON从服务器获取信息,什么是JSON对象,JSONArray。 在智能手机应用程序开发中,这是一个相当常见的任务,它可以向网站查询某些信息,进行一些处理,并以不同的形式将其呈现给用户。 有两种不同的主要方式来解决这个问题:
1.)只需下载整个网页并使用HTML或XML解析器来尝试并提取所需的信息。
2.)有些网站的API允许查询,而不是返回网页,返回XML,JSON或其他呈现数据的方式。
显然,选项2(如果有的话)更有意义。 不要下载大型网页(浪费数据),解析整个东西(浪费电池),然后尝试分析它(浪费你的时间经历通常不正确的HTML编写),你可以下载更小,更易于管理的文本,到XML,JSON或者API提供的任何东西。 (我将很快发布有关选项1的另一个教程)。
您可能想知道为什么您想为您的智能手机应用程序使用JSON而不是XML。 毕竟,XML多年来一直是一个非常流行的技术流行语。 然而,有一个好的(和简单的)理由。 XML(通常)更大。 XML中的结束标记不存在于JSON中,因此为每个不需要的标记节省几个字节。 JSON通常可以使用较少的字符表示相同的数据,因此每次向网站发出查询时都可以节省手机传输更多数据的时间。 这使得JSON成为快速高效的网站查询的自然选择(对于提供它的网站)。
一个这样的网站是http://www.archive.org。 在其他许多方面,archive.org允许人们上传来自音乐会的录音以供其他人免费下载。 这非常棒。 他们也有一个API,它允许你查询他们的系统,它将返回XML,JSON或其他各种格式的结果。
我目前正在编写一个应用程序,用于通过手机浏览archive.org查找节目,然后下载或流式传输曲目。 我会告诉你如何使用JSON和几行代码来完成第一部分(查找演示)。
首先,你需要你的JSON查询。 我将查询archive.org“Lotus”,要求包含10个项目的JSON结果以及它们各自的日期,格式,标识符,媒体类型和标题。 根据archive.org搜索API,我的查询应该如下所示:
String archiveQuery = "http://www.archive.org/advancedsearch.php?q=Lotus&fl[]=date&fl[]=format&fl[]=identifier&fl[]=mediatype&fl[]=title&sort[]=createdate+desc&sort[]=&sort[]=&rows=10&page=1&output=json&callback=callback&save=yes";
现在我们有了我们的查询,我们使用查询来模拟打开一个HTTP连接,获取输入的字节流并将其转换为JSON对象。 在附注中,请注意,我正在使用BufferedInputStream,因为它的read()调用可以一次抓取多个字节并将它们放入内部缓冲区。 一个普通的InputStream每次读取抓取一个字节(),所以它必须更多地操作OS,并且速度较慢并且浪费更多的处理能力(这反过来又浪费了电池寿命)。
InputStream in = null;String queryResult = "";
try { URL url = new URL(archiveQuery);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) urlConn;
httpConn.setAllowUserInteraction(false);
httpConn.connect();
in = httpConn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int read = 0; int bufSize = 512;
byte[] buffer = new byte[bufSize];
while(true)
{
read = bis.read(buffer);
if(read==-1){ break; }
baf.append(buffer, 0, read);
}
queryResult = new String(baf.toByteArray());
}
catch (MalformedURLException e)
{
// DEBUG
Log.e("DEBUG: ", e.toString());
}
catch (IOException e)
{
// DEBUG
Log.e("DEBUG: ", e.toString());
}
此时,我们的JSON响应存储在String queryResult中。 它看起来有点像这样:
callback({ "responseHeader": {... *snip* ... }, "response": { "numFound": 1496, "start": 0, "docs": [{ "mediatype": "audio", "title": "The Disco Biscuits At Starscape 2010", "identifier": "TheDiscoBiscuitsAtStarscape2010", "format": ["Metadata", "Ogg Vorbis", "VBR MP3"] }, { "title": "Lotus Live at Bonnaroo Music & Arts Festival on 2010-06-10", "mediatype": "etree", "date": "2010-06-10T00:00:00Z", "identifier": "Lotus2010-06-10TheOtherStageBonnarooMusicArtsFestivalManchester", "format": ["Checksums", "Flac", "Flac FingerPrint", "Metadata", "Ogg Vorbis", "Text", "VBR MP3"] }, { "title": "Lotus Live at Mr. Smalls Theatre on 2006-02-17", "mediatype": "etree", "date": "2006-02-17T00:00:00Z", "identifier": "lotus2006-02-17.matrix", "format": ["64Kbps M3U", "64Kbps MP3", "64Kbps MP3 ZIP", "Checksums", "Flac", "Flac FingerPrint", "Metadata", "Ogg Vorbis", "Text", "VBR M3U", "VBR MP3", "VBR ZIP"] }, {... *snip* ...
我们看到我们想要的信息存储在一个数组中,其关键字是“docs”,并包含在名为“response”的项中。 我们可以非常容易地使用Android提供的JSONObject类获取这些信息,如下所示:
JSONObject jObject;try { jObject = new JSONObject(queryResult.replace("callback(", "")).getJSONObject("response"); JSONArray docsArray = jObject.getJSONArray("docs"); for (int i = 0; i < 10; i++) { if (docsArray.getJSONObject(i).optString("mediatype").equals("etree")) { String title = docsArray.getJSONObject(i).optString("title"); String identifier = docsArray.getJSONObject(i).optString("identifier"); String date = docsArray.getJSONObject(i).optString("date"); System.out.println(title + " " + identifier + " " + date); } }} catch (JSONException e) { // DEBUG Log.e("DEBUG: ", JSONString); Log.e("DEBUG: ", e.toString());}
我做的第一件事是从“queryResult”创建一个JSONObject,这是来自archive.org的JSON响应。 请注意,我从JSON字符串中删除了“callback(”),因为尽管archive.org返回它,它实际上不应该是JSON字符串的一部分(当我捕获JSONException错误时,我意识到这一点)。
之后,我们准备做一些JSON解析。 由于这只是一个教程,我将“10”硬编码到for循环中,因为我请求了10个项目。 在生产代码中这是一个糟糕的主意(如果你不知道你为什么是一个巨大的noob,并且不应该写产品代码)。 我只需要媒体类型为“etree”的项目,并为每个项目打印标题,标识符和日期。
瞧,你现在知道如何在Android中使用JSON。
资源
它的格式对于人类来说是易于阅读和编写的,但对于计算机来说仍然很容易解析。 它用于人员和机器都需要读取数据(如配置文件)的地方。 它还用于机器发送对方的数据,以方便编程比文件大小或解析时间更重要(因为JSON内置解析器读取JSON文件比解析二进制格式更容易编写,而且更少脆弱)。
这些都是关于格式的。与传统的xml相比,它更轻量级。您可以使用它来序列化和传输结构化数据。请看这个问题。更详细地解释它。
链接地址: http://www.djcxy.com/p/47825.html