Android开发--Json数据的解析

               

在执行解析数据之前,需要将一个类库应用到你的程序中,下载的地址是:

http://code.google.com/p/google-gson/ 

下载解压之后你需要将蓝色标记的文件放入到你的程序之中应用Android开发--Json数据的解析

首先,我们需要知道什么是Json数据:

JSON的定义:
       一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决
方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org

说到这里,可能会发现Json数据与XML文件很相似,下面,我们看下它们之间的对比:

1.JSON和XML的数据可读性基本相同
2.JSON和XML同样拥有丰富的解析手段
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML


下面,我们看下Android官方文档给出的一个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数组,里面有两个对象,我们需要对其进行解析,下面的链接是官方文档对其解析的例子:

点击打开链接

下面,以一个具体的例子对其进行说明:

在这个例子中介绍三种解析Json的方法,其中第二和第三类是利用类对象和Json数据的互相转换完成的解析。

下面是实现的截图:

Android开发--Json数据的解析

第一个按钮的作用是利用Google提供的Api解析Json数据,这里给出的是一个数组,具体的实现代码如下:

public class JsonUtils public void parseJson(String jsonData) {  try {   //创建JsonReader 对象  JsonReader reader = new JsonReader(new StringReader(jsonData));  //开始解析数组  reader.beginArray();  //循环判断有没有下一个Json对象        while(reader.hasNext()){  //开始解析Json对象        reader.beginObject();  //循环判断Json对象里面有没有下一个键值对  while(reader.hasNext()){  String tagName = reader.nextName();  if(tagName.equals("name")){  //name键多对应的值   Log.d("BruceZhang", "name: "+reader.nextString());  }else if(tagName.equals("age")){  //age键多对应的值  Log.d("BruceZhang", "age: "+reader.nextString());  }  }  //Json对象的结尾  reader.endObject();  }        //数组解析的结尾        reader.endArray();  } catch (Exception e) {   // TODO: handle exception   e.printStackTrace();  } }}

在主程序的调用如下:

private void jsonArray(String jsonData) {  JsonUtils jsonUtils=new JsonUtils();  jsonUtils.parseJson(jsonData); }

第二个按钮是利用类对象向Json数据的转换进行的解析,下面是实现的代码:

public class JsonUtils2 public void parseUserFromJson(String jsonData){  Gson gson=new Gson();  //把Json对象转换成User对象  User user=gson.fromJson(jsonData, User.class);  Log.d("BruceZhang", "name:"+user.getName());  Log.d("BruceZhang", "name:"+user.getAge()); }}

在主程序的调用如下:

private void userJson(String jsonData){  JsonUtils2 jsonUtils=new JsonUtils2();  jsonUtils.parseUserFromJson(jsonData); }

第三个按钮同第二个按钮的原理是一样的,不过这里解析的Json数组,代码如下:

public class JsonUtils3 public void parseUserFromJson(String jsonData){//  Type listType=(Type) new TypeToken<LinkedList<User>>(){}.getType();//  Gson gson=new Gson();//  LinkedList<User> users=gson.fromJson(jsonData, (java.lang.reflect.Type) listType);//  for(Iterator<User> iterator=users.iterator();iterator.hasNext();){//   User user=(User)iterator.next();//   Log.d("BruceZhang", "name: "+user.getName());//   Log.d("BruceZhang", "name: "+user.getAge());//  }  Type listType = new TypeToken<LinkedList<User>>(){}.getType();  Gson gson = new Gson();  //LinkList是双向链表  LinkedList<User> users = gson.fromJson(jsonData, listType);  for (Iterator<User> iterator = users.iterator(); iterator.hasNext();) {   User user = (User) iterator.next();//   System.out.println(user.getName());//   System.out.println(user.getAge());   Log.d("BruceZhang", "name: "+user.getName());   Log.d("BruceZhang", "name: "+user.getAge());  } }}

在主程序的调用如下:

 private void userJsonArray(String jsonData){  JsonUtils3 jsonUtils=new JsonUtils3();  jsonUtils.parseUserFromJson(jsonData); }

下面给出主程序的完整代码:

public class MainActivity extends Activity /*  * 1.开始解析数组  * 2.开始解析对象  * 3.解析键值对(多个)  * 4.解析对象结束  * 5.开始解析对象  * 6.解析键值对  * 7.解析对象结束  * 8.解析数组结束  */ private String  jsonData="[{\"name\":\"BruceZhang\",\"age\":20},{\"name\":\"ZhangHu\",\"age\":23}]"private String jsonData2="{\"name\":\"BruceZhang\",\"age\":20}"private Button button; private Button button2; private Button button3; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  button=(Button)findViewById(R.id.button);  button.setOnClickListener(new MyButton());  button2=(Button)findViewById(R.id.button2);  button2.setOnClickListener(new MyButton());  button3=(Button)findViewById(R.id.button3);  button3.setOnClickListener(new MyButton()); }  class MyButton implements OnClickListener{  @Override  public void onClick(View v) {   // TODO Auto-generated method stub   switch (v.getId()) {   case R.id.button:    jsonArray(jsonData);    break;   case R.id.button2:    userJson(jsonData2);    break;   case R.id.button3:    userJsonArray(jsonData);    break;   default:    break;   }  }   } private void jsonArray(String jsonData) {  JsonUtils jsonUtils=new JsonUtils();  jsonUtils.parseJson(jsonData); }  private void userJson(String jsonData){  JsonUtils2 jsonUtils=new JsonUtils2();  jsonUtils.parseUserFromJson(jsonData); }  private void userJsonArray(String jsonData){  JsonUtils3 jsonUtils=new JsonUtils3();  jsonUtils.parseUserFromJson(jsonData); } @Override public boolean onCreateOptionsMenu(Menu menu) {  // Inflate the menu; this adds items to the action bar if it is present.  getMenuInflater().inflate(R.menu.activity_main, menu);  return true; }}


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.****.net/jiangjunshow