工作點滴之Json解析 – Android移動開發技術文章_手機開發 Android移動開發教學課程

    Android開發過程中,數據傳輸是難免的,一般組織數據有兩種方式:xml格式和json格式。兩者解析都非常方便,而且解析工具也都很多,這裡不多作比較。
      下面就Json格式的解析做一個比較實用的分析:
       1) 解析Json格式的數據
       2) 解析單個對象
       3) 解析對象的集合
 
一 大前提–什麼是Json ?
1.如果不知道什麼是Json,先掃一下盲
 1)JSON:JavaScript Object Notation
 2)  JSON數據是一系列鍵值對的集合
 3)官方網址:www.json.org, 去看看就什麼都明白瞭
 
2.Json vs xml
 1) JSON和XML可讀性基本相同
 2)JSON和XML通用擁有豐富的解析手段
 3)JSON相對XML來講體積更小
 4)JSON與JavaScript的交互性更加方便
 5) JSON對數據的描述性相對較差
 
二 Android 中的JSON解析工具
1.從API level 11 開始(也就是Android3.0),在android.util包下就有瞭JsonReader 和 JsonWriter兩個幫助類,供我們來解析和使用json。
 
2.Android3.0以下系統的最佳的做法是使用Google的gson類庫來解析,其實這也是3.0以後的做法,隻是集成瞭進來,
下載地址:http://code.google.com/p/google-gson/downloads/list
 
3.下載後的jar文件導入到項目中,我相信這大傢都會,下面的例子我采用的是gson來解析。
 
三 JSON實戰
1. 解析json格式的數據
比如說有一個User對象,他有兩個屬性:name和age,當然實際情況可能有更多的屬性,
那麼用json格式表示就是:{name:"Ian", age: "20"},我相信你懂的。
1)自定義JSON幫助類–JsonUtils
Java代碼 
public class JsonUtils { 
     
    public void parseJson(String jsonData) { 
         
        try { 
            JsonReader reader = new JsonReader(new StringReader(jsonData)); 
            reader.beginArray(); 
            while (reader.hasNext()) { 
                reader.beginObject(); 
                while(reader.hasNext()) { 
                    String tagName = reader.nextName(); 
                    if(tagName.equals("name")) { 
                        System.out.println("name—>" + reader.nextString()); 
                    } else if(tagName.equals("age")) { 
                        System.out.println("age—>" + reader.nextString()); 
                    } 
                } 
                reader.endObject(); 
            } 
            reader.endArray(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
         
    } 

 
 
2) Activity代碼
 
Java代碼 
public class MainActivity extends Activity { 
    private Button btnStart; 
    private String jsonDataUser = "{\"name\":\"Ian\",\"age\":20}"; 
 
 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        btnStart = (Button)findViewById(R.id.btnStart); 
        btnStart.setOnClickListener(new BtnStartSetOnClickListener()); 
         
         
    } 
     
    private class BtnStartSetOnClickListener implements OnClickListener { 
        @Override 
        public void onClick(View v) { 
            JsonUtils jsonUtils = new JsonUtils(); 
            jsonUtils.parseJson(jsonData); 
        } 
    } 
}  
 就這麼幾行代碼,在Console上就可以看到解析輸出的信息瞭,是不是很簡單呢?
 
 
2. 解析對象
1)上面解析的是字符串形式,如果我們定義一個User對象會怎麼樣呢?
 
Java代碼 
public class User { 
    private String name; 
    private int age; 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public int getAge() { 
        return age; 
    } 
    public void setAge(int age) { 
        this.age = age; 
    } 

 
2) 解析方法
 
Java代碼 
public void parseUserFromJson(String jsonData) { 
     
    Gson gson =new Gson(); 
    User user = gson.fromJson(jsonData, User.class); 
    System.out.println("name———->" + user.getName()); 
    System.out.println("age———->" + user.getAge());    
     

 
是不是更簡單瞭呢?
 
3. 解析集合
1)如果不是單個User,而是ArrayList<User>,那麼該怎麼解析啊,因為這個太常見瞭。
要解決這個問題,得先弄明白集合用json該怎麼表示,簡單來講“{}”表示一個對象,“[]”表示一個集合,集合裡面可以有多個對象,這樣表示[{},{},{}]。OK,那麼看實戰代碼,
json數據:
 
Java代碼 
private String jsonDataUsers = "[{\"name\":\"Jack\",\"age\":20},{\"name\":\"Tom\",\"age\":22},{\"name\":\"Ian\",\"age\":20}]"; 
 解析代碼:
 
Java代碼 
public void parseUserFromJson(String jsonData) { 
 
        Type typeList = new TypeToken<ArrayList<User>>(){}.getType(); 
        Gson gson = new Gson(); 
        LinkedList<User> users = gson.fromJson(jsonData, typeList); 
        for(Iterator<User> iterator = users.iterator(); iterator.hasNext();) { 
            User user = iterator.next(); 
            System.out.println("name———->" + user.getName()); 
            System.out.println("age———->" + user.getAge()); 
        } 
    } 
 
我們可以看到,隻是多瞭一行“Type typeList = new TypeToken<ArrayList<User>>(){}.getType();”,就可以解析出List來,然後迭代List就可以得到整個數據
瞭,真的很方便,還等什麼呢,趕快試試看吧!

發佈留言