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

Why do we use JSON in android?

我正在学习JSON,我认识到我如何使用它以及它是如何工作的,但是我不清楚,为什么我们要在我们的项目和程序中使用它。如果你们中有人为我描述原因,我会很高兴…

谢谢你的回答…


在这里,您将学习如何在Android中使用JSON从服务器获取信息,什么是JSON对象,JSONarray。在智能手机应用程序开发中,查询网站以获取一些信息、进行一些处理并以不同的形式呈现给用户是一项非常常见的任务。为此,有两种不同的主要方式:好的。

1.)只需下载整个网页,并使用HTML或XML解析器尝试提取所需的信息。好的。

2.)有些网站有API,允许查询而不是返回网页、返回XML、JSON或其他呈现数据的方式。好的。

显然,选项2(如果可用)更有意义。您可以下载更小、更容易管理符合XML、JSON或API提供的任何文本,而不是下载一个大网页(浪费数据)、解析整个网页(浪费电池),然后尝试分析它(浪费您的时间,通常是编写不当的HTML)。(我将很快发布另一个关于选项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,我的查询应该如下所示:好的。

1
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每次读取一个字节(),因此它必须更麻烦操作系统,速度更慢,浪费更多的处理能力(这反过来又浪费了电池寿命)。好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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中。看起来像这样:好的。

1
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类获取这些信息,如下所示:好的。

1
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,不应该写生产代码)。我只想要mediatype为"etree"的项目,对于这些项目,我打印标题、标识符和日期。好的。

瞧,你现在知道如何在Android中使用JSON了。好的。

来源好的。好啊.


它的格式对人类来说很容易读写,但对计算机来说仍然很容易解析。它用于人和机器都需要读取数据的地方(如配置文件)。它还用于机器之间发送数据的情况,在这种情况下,易于编程比文件大小或解析时间更重要(因为JSON内置了读取JSON文件的解析器,比解析二进制格式更容易快速写入,而且不那么脆弱)。


这都是关于格式的。与传统的XML相比,它要轻得多。您可以使用它来序列化和传输结构化数据。看一下这个问题。详细解释一下。