说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android JSON解析类 - JsonReader

HTML文档下载 WORD文档下载 PDF文档下载
Android JSON解析类 - JsonReader

作者:Android开发网


   在Android 3.0 honeycomb开始提供了新的JSON解析类 - android.util.JsonReader,下面Android123以下面的JSON为例子

[
   {
     "id": 912345678901,
     "text": "How do I read JSON on Android?",
     "geo": null,
     "user": {
       "name": "android_newb",
       "followers_count": 41
      
   },
   {
     "id": 912345678902,
     "text": "@android_newb just use android.util.JsonReader!",
     "geo": [50.454722, -104.606667],
     "user": {
       "name": "jesse",
       "followers_count": 2
     }
   }
 ]}

 则解析上面的JSON,使用下面代码即可,整个处理方法和解析XML差不多,最终使用List数组保存,不过Android开发网提示大家,下面的编码为UTF-8如果遇到中文,服务器默认按GBK编码,下面的UTF-8改为GB2312可以解决乱码问题。

 public List readJsonStream(InputStream in) throws IOException {
     JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
     return readMessagesArray(reader);
   
 
   public List readMessagesArray(JsonReader reader) throws IOException {
     List messages = new ArrayList();
 
     reader.beginArray();
     while (reader.hasNext()) {
       messages.add(readMessage(reader));
     }
     reader.endArray();
     return messages;
   }
 
   public Message readMessage(JsonReader reader) throws IOException {
     long id = -1;
     String text = null;
     User user = null;
     List geo = null;
 
     reader.beginObject();
     while (reader.hasNext()) {
       String name = reader.nextName();
       if (name.equals("id")) {
         id = reader.nextLong();
       } else if (name.equals("text")) {
         text = reader.nextString();
       } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
         geo = readDoublesArray(reader);
       } else if (name.equals("user")) {
         user = readUser(reader);
       } else {
         reader.skipValue();
       }
     }
     reader.endObject();
     return new Message(id, text, user, geo);
   }
 
   public List readDoublesArray(JsonReader reader) throws IOException {
     List doubles = new ArrayList();
 
     reader.beginArray();
     while (reader.hasNext()) {
       doubles.add(reader.nextDouble());
     }
     reader.endArray();
     return doubles;
   }
 
   public User readUser(JsonReader reader) throws IOException {
     String username = null;
     int followersCount = -1;
 
     reader.beginObject();
     while (reader.hasNext()) {
       String name = reader.nextName();
       if (name.equals("name")) {
         username = reader.nextString();
       } else if (name.equals("followers_count")) {
         followersCount = reader.nextInt();
       } else {
         reader.skipValue();
       }
     }
     reader.endObject();
     return new User(username, followersCount);
   }}

   最终Android123再次提醒大家,JsonReader是Android 3.0引入的新解析类,必须在API Level为honeycomb中的SDK以及固件在3.0上才能使用,完整的成员如下

Public Constructors
 JsonReader(Reader in)  公共构造方法
 
void  beginArray()
Consumes the next token from the JSON stream and asserts that it is the beginning of a new array.
void  beginObject()
Consumes the next token from the JSON stream and asserts that it is the beginning of a new object.
void  close()
Closes this JSON reader and the underlying Reader.
void  endArray()
Consumes the next token from the JSON stream and asserts that it is the end of the current array.
void  endObject()
Consumes the next token from the JSON stream and asserts that it is the end of the current array.
boolean  hasNext()
Returns true if the current array or object has another element.
boolean  isLenient()
Returns true if this parser is liberal in what it accepts.
boolean  nextBoolean()
Returns the boolean value of the next token, consuming it.
double  nextDouble()
Returns the double value of the next token, consuming it.
int  nextInt()
Returns the int value of the next token, consuming it.
long  nextLong()
Returns the long value of the next token, consuming it.
String  nextName()
Returns the next token, a property name, and consumes it.
void  nextNull()
Consumes the next token from the JSON stream and asserts that it is a literal null.
String  nextString()
Returns the string value of the next token, consuming it.
JsonToken  peek()
Returns the type of the next token without consuming it.
void  setLenient(boolean lenient)
Configure this parser to be be liberal in what it accepts.
void  skipValue()
Skips the next value recursively.
String  toString()
Returns a string containing a concise, human-readable description of this object.

致远文杰:传统企业如何实现移动化转型? 记华为HCC2013 Day2:SDN开放编程系统OPS打造生态圈 HCC2013:华为FusionCube融合至简,性能至优 已确认Stephen Elop候选微软下任CEO 英语对于软件开发者来说到底有多重要? 想暴揍VC 向前辈请教一个问题,在MS-SQL Server平台上用Delphi开发网络数据库需要学多长时间?前辈们认为最有用的书是什么?谢谢! java mail问题。知道的快来!!! ASP软件 请问一个windows编程问题:如果编写一个程序定期更换windows的桌面? 求教使用“Shockwave Flash Object”控件插入SWF文件打包后,为什么不能运行! 本网站与某论坛合作,该论坛有固定域名,可不可以通过域名解析实现访问。 关于在cpp中使用stl用法注意! 如何在程序中监测带有用户名和密码框的窗体和网页! 一个圆柱体,它的侧面积展开图正好是一个边吃为31, 一个圆柱体侧面展开图是正方形,他的底面周长是31. 一个圆柱体的侧面展开后是一个正方形.这个圆柱体的地 一个圆柱体底面周长是6.28分米把它的侧面展开正好 有一个底面周长是6.28分米的圆柱体的机件,它的侧 一个圆柱体侧面展开后是一周长为25.12厘米的正方 一个圆柱体的表面积是31.4平方厘米,底面周长是6 一个圆柱体的底面积的周长是25.12;厘米,高是1 一个圆柱体的侧面积是31.4平方厘米,底面周长是6 美国国土安全部爆工资丑闻 1年多发8克里称NSA监控为“自动导航” 指责巴基斯坦塔利班首领被美击毙 巴和平进美83岁珠宝大盗涉嫌“重操旧业”被捕NSA被曝窃听国际货币基金组织和世界工信部:已于年初开始5G研发 202神秘笔记背后是什么? 全境封锁新宣传气体探测器在南美火山科考中保障极端环《补天志》缤纷时装秀 性感美腿大胆出果然比小米电视主机好用—yobbom风生水起(小说520)乌龙大巫师残厨(飞库)矿工传奇之gm也疯狂创世之路大召寺旅游昭君墓旅游蒙古文化风情园旅游黑山头古城旅游额尔古纳河旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘