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

标签 android json

我正在研究json,我知道如何使用它以及它是如何工作的,但是我不清楚,为什么我们要在项目和程序中使用它。
如果你们中有人为我描述原因,我会很高兴…
谢谢你的回答…

最佳答案

在此,您将学习如何在android中使用json从服务器获取信息,什么是json对象jsonarray。在智能手机应用程序开发中,查询网站以获取一些信息、进行一些处理并以不同的形式呈现给用户是一项相当常见的任务。有两种不同的主要方式:
1.)只需下载整个网页并使用HTML或XML解析器尝试提取所需的信息。
2.)有些网站有API,允许查询而不是返回网页,返回XML、JSON或其他表示数据的方式。
显然,选择2(如果有的话)更有意义。与其下载一个大的网页(浪费数据),解析整个东西(浪费电池),然后尝试分析它(浪费你的时间去浏览通常不正确编写的html),你可以下载更小,更容易管理的文本,它符合xml,json,或者任何它是API提供了。(我很快将发布另一个关于选项1的教程)。
您可能想知道为什么要在智能手机应用程序中使用json而不是xml。毕竟,XML多年来一直是一个大肆宣传的技术术语。然而,有一个很好(而且很简单)的理由。XML通常更大。json中不存在xml中的结束标记,因此为每个不需要的标记节省几个字节。json通常可以使用较少的字符来表示相同的数据,这样就避免了每次查询到网站时手机都要传输更多的数据。这使得json成为快速高效的网站查询(对于提供json的网站)的自然选择。
其中一个这样的网站是http://www.archive.org。除此之外,archive.org还允许人们上传音乐会的录音,供其他人免费下载。太棒了。它们还有一个api,允许您查询它们的系统,该系统将以xml、json或各种其他格式返回结果。
我目前正在编写一个应用程序,用于从您的手机浏览archive.org以查找节目,然后下载或流式播放曲目。我将向您展示如何使用json和几行代码完成第一部分(查找显示)。
首先,您需要json查询。我将查询archive.org中的“lotus”,要求得到一个json结果,其中包含10个条目,分别具有日期、格式、标识符、mediatype和标题。根据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响应存储在字符串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解析。因为这只是一个教程,所以我在for循环中硬编码“10”,因为我请求了10个项。这在生产代码中是一个坏主意(如果您不知道为什么您是一个巨大的noob,不应该编写生产代码)。我只想要mediaType为“etree”的项,并且为每个项打印标题、标识符和日期。
瞧,你现在知道如何在android中使用json了。
source

关于android - 为什么我们在android中使用JSON? ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23167167/

相关文章:

android - 在Android中将电话号码格式化为E164格式

android - 使用新的 Google Drive API 检索帐户名

json - 如何解决 modelbinder 为 JSON post 转换(或不转换)空值的问题

c# - 如何在 C# 中导航任何 JSON 树?

javascript - 如何使用ajax调用从现有url显示json数据

android - TimePicker 工作正常但不是 DatePicker

android - 识别 Android 平板电脑是否有 sim 卡插槽

java - 使用 JOLT 转换具有嵌套数组对象的对象数组

json - 如何在 ionic 3 中使用 ngx-translate 解决 "ERROR SyntaxError: Unexpected token/in JSON at position 0"?

android - 如何在 onSizeChanged 中设置大小和布局?