为什么我们在android中使用JSON?

时间:2014-04-19 07:17:51

标签: android json

我正在研究JSON,我认识到我可以如何使用它以及它是如何工作的。但我不明白,为什么我们在项目和程序中使用它。 如果你们其中一个人为我描述原因,我会很高兴......

感谢您的回答...

3 个答案:

答案 0 :(得分:11)

在此,您将学习如何在Android中使用JSON从服务器获取信息,什么是JSON Object,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每次读取一个字节(),因此它必须更多地调整操作系统并且速度更慢并且浪费更多的处理能力(这反过来会浪费电池寿命)。

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个项目。这在生产代码中是一个坏主意(如果你不知道为什么你是一个巨大的菜鸟,不应该编写生产代码)。我只想要mediatype是“etree”的项目,并且对于每个项目,我打印标题,标识符和日期。

Voila,您现在知道如何在Android中使用JSON。

source

答案 1 :(得分:4)

它是一种易于人类读写的格式,但仍然很容易被计算机解析。它用于人和机器都需要读取数据(如配置文件)。它还用于机器在编程简单比文件大小或解析时间更重要的情况下发送彼此数据(因为JSON内置解析器读取JSON文件比解析二进制格式更容易编写,而且更少脆弱)。

答案 2 :(得分:1)

关于格式的全部内容。与传统的xml相比,它更轻巧。您可以使用它来序列化和传输结构化数据。看看this问题。详细解释它。