Android解析Json数据

jopen 10年前

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

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;   }    }