Android Json解析 网络(三)

本文介绍了如何使用Java的GSON库解析JSON数据,包括解析JSON对象、从网络获取JSON数据及JSON数据的两种解析方法。文章还详细解释了JSON数据的基本结构和规则,以及如何将JSON数据转换为JavaBean。

之前学习了解析XML文件的两种方法。

接下来学习Json解析网络资源(使用Json得去Google官网下载GSON包然后导入)

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 
从结构上看,所有的数据(data)最终都可以分解成三种类型: 
第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。 
第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。 
第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。 
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。 
1) 并列的数据之间用逗号(",")分隔。 
2) 映射用冒号(":")表示。 
3) 并列数据的集合(数组)用方括号("[]")表示。 
4) 映射的集合(对象)用大括号("{}")表示。



         ——————————————————————————————————————————————————————————————————————-

先同解析XML文件相似,创建一个JAVABEAN student类:

public class Student {
    private String name;
    private int age;
    private String id;
 
    public Student() {
        super();
    }
 
    public Student(String name, int age, String id) {
        super();
        this.name = name;
        this.age = age;
        this.id = id;
    }
 
    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;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
}
使用GSON解析JSON对象:

public class JsonUtils {
    public static List<Student> parseStudentFromJson(String data) {
        Type listType = new TypeToken<LinkedList<Student>>() {
        }.getType();
        Gson gson = new Gson();
<span style="white-space:pre">	</span>//如果要处理的JSON字符串只包含一个JSON对象,则可以直接使用fromJson获取一个student对象:
        LinkedList<Student> list = gson.fromJson(data, listType);
        return list;
    }
}
从网络上获取JSON,实际是获取字符串:

public class HttpUtils {   //从服务器端下载到Json数据,也就是个字符串
    public static String getData(String url) throws Exception {
        StringBuilder sb = new StringBuilder();
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        HttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        if (httpEntity != null) {
            InputStream instream = httpEntity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    instream));
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        }
        return null;
    }

接下来是主函数:

public class MainActivity extends Activity {
    private TextView textView;
    private List<Student> list;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        String data = null;
        try {
            data = HttpUtils
                    .getData("http://10.16.12.165:8080/JsonTest/JsonTestServlet");
        } catch (Exception e) {
            e.printStackTrace();
        }
        String result = "";
        list = JsonUtils.parseStudentFromJson(data);
        for (Student s : list) {
            result += "name: " + s.getName() + "   " + "age: " + s.getAge()
                    + "   " + "id: " + s.getId() + "\n";
        }
        textView.setText(result);
    }
}


利用GSON解析JSON的另一种方法:

通过获取JsonReader对象解析JSON数据: 

String jsonData = "[{\"username\":\"arthinking\",\"userId\":001},{\"username\":\"Jason\",\"userId\":002}]"; 
try{ 
<span style="white-space:pre">	</span>JsonReader reader = new JsonReader(new StringReader(jsonData)); 
<span style="white-space:pre">	</span>reader.beginArray(); 
<span style="white-space:pre">	</span>while(reader.hasNext()){ 
<span style="white-space:pre">		</span>reader.beginObject(); 
<span style="white-space:pre">		</span>while(reader.hasNext()){ 
<span style="white-space:pre">			</span>String tagName = reader.nextName(); 
<span style="white-space:pre">			</span>if(tagName.equals("username")){ 
<span style="white-space:pre">			</span>System.out.println(reader.nextString()); 
<span style="white-space:pre">			</span>}<span style="white-space:pre">	</span> 
<span style="white-space:pre">			</span>else if(tagName.equals("userId")){ 
<span style="white-space:pre">			</span>System.out.println(reader.nextString()); 
<span style="white-space:pre">		</span>} 
<span style="white-space:pre">	</span>} 
<span style="white-space:pre">	</span>reader.endObject(); 
<span style="white-space:pre">	</span>} 
<span style="white-space:pre">	</span>reader.endArray(); 
} 
catch(Exception e){ 
<span style="white-space:pre">	</span>e.printStackTrace(); 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值