JSON数据格式与 解析

一、JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。  JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

二、JSON的两种结构:

1、“名称/值”对的集合。

2、值的有序列表,一般称为数组。

JSON具有以下这些形式:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

JSON数据格式与 解析

 

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

 

JSON数据格式与 解析

 

值(value)可以是双引号括起来的字符串(string)、数值(number)、truefalsenull、对象(object)或者数组(array)。这些结构可以嵌套。

JSON数据格式与 解析

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。

JSON数据格式与 解析

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

JSON数据格式与 解析

 

空白可以加入到任何符号之间。

以上 – Json.org。

 

三、JSON的复杂结构。

这里有某个网站返回数据如下:

{"showapi_res_code":0,"showapi_res_error":"","showapi_res_body":{"list":[{"p0":"6.07","p90":"6.4","p93":"6.5","p97":"6.94","prov":"辽宁"}],"ret_code":0}}

其数据结构如下

image

 

 

在Java中生成此数据,可以更好的理解JSON的数据结构。

代码如下:

先定义个Prov类:

package com.example.test;

public class Prov

{

    private String p0, p90, p93, p97,prov;  //每个变量的名字和网站得到的JSON数据的名字对应,否则不能正确解析数据。生成的数据格式一样,但 名称/值 中的名称不一样。







    public String getProv()

    {

        return prov;

    }



    public void setProv(String prov)

    {

        this.prov = prov;

    }



    public String getP0()

    {

        return p0;

    }



    public void setP0(String p0)

    {

        this.p0 = p0;

    }



    public String getP90()

    {

        return p90;

    }



    public void setP90(String p90)

    {

        this.p90 = p90;

    }



    public String getP93()

    {

        return p93;

    }



    public void setP93(String p93)

    {

        this.p93 = p93;

    }



    public String getP97()

    {

        return p97;

    }



    public void setP97(String p97)

    {

        this.p97 = p97;

    }



}

其上一层的Body类:

package com.example.test;



import java.util.List;



public class Body

{

    private String ret_code;

    private List<com.example.test.Prov> list;//这里名字用list,和网站得到的JSON数据对应名字。否则格式生成的数据格式一样,但名字一样。解析JSON数据时,也不能正确解析。



    public String getRet_code()

    {

        return ret_code;

    }



    public void setRet_code(String ret_code)

    {

        this.ret_code = ret_code;

    }



    public List<com.example.test.Prov> getProv()

    {

        return list;

    }



    public void setProv(List<com.example.test.Prov> prov)

    {

        this.list = prov;

    }



}

 

再上一层的数据ListData类

package com.example.test;





public class ListData

{

    //同上面两个相同,定义变量的名字要和JSON里的一致。

    private String  showapi_res_code,showapi_res_error;

    private Body showapi_res_body;



    public String getShowapi_res_code()

    {

        return showapi_res_code;

    }



    public void setShowapi_res_code(String showapi_res_code)

    {

        this.showapi_res_code = showapi_res_code;

    }



    public String getShowapi_res_error()

    {

        return showapi_res_error;

    }



    public void setShowapi_res_error(String showapi_res_error)

    {

        this.showapi_res_error = showapi_res_error;

    }



    public Body getShowapi_res_body()

    {

        return showapi_res_body;

    }



    public void setShowapi_res_body(Body showapi_res_body)

    {

        this.showapi_res_body = showapi_res_body;

    }

    

}

 

最好,在main中处理JSON数据

package com.example.test;



import java.util.ArrayList;

import java.util.List;



import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.Window;

import android.widget.Button;

import android.widget.TextView;



import com.google.gson.Gson;

import com.show.api.ShowApiRequest;



public class MainActivity extends Activity implements OnClickListener

{

    private Button btn;

    private TextView textView;



    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_main);



        textView = (TextView) findViewById(R.id.textview);

        btn = (Button) findViewById(R.id.btn);



        btn.setOnClickListener(this);



        String res = new ShowApiRequest("http://route.showapi.com/138-46", "1255", "9b8cc3f4086048b8a506d731d1af0a9c")

                .addTextPara("prov", "辽宁").post();



        System.out.println(res);



        // ------------将对象专程JSON数据---开始



        com.example.test.Prov prov = new com.example.test.Prov();

        prov.setP0("6.07");

        prov.setP90("6.4");

        prov.setP93("6.5");

        prov.setP97("6.97");

        prov.setProv("辽宁");



        List<com.example.test.Prov> provlist = new ArrayList<com.example.test.Prov>();

        provlist.add(prov);



        Body body = new Body();

        body.setRet_code("0");

        body.setProv(provlist);



        ListData listData = new ListData();



        listData.setShowapi_res_body(body);

        listData.setShowapi_res_error("");

        listData.setShowapi_res_code("0");



        Gson gson = new Gson();

        String s = gson.toJson(listData);



        System.out.println(s);



        // ------------将对象专程JSON数据---结束



        // ----------------解析JSON数据 ---开始

        ListData listDatas = gson.fromJson(res, ListData.class);

        String showapi_res_code = listDatas.getShowapi_res_code();

        String showapi_res_error = listDatas.getShowapi_res_error();

        Body body2 = listDatas.getShowapi_res_body();

        System.out.println("showapi_res_code = " + showapi_res_code + "           " + "showapi_res_error = "

                + showapi_res_error + "              ret_code=" + body2.getRet_code());



        List<Prov> prov2 = body2.getProv();



        for (Prov prov1 : prov2)

        {

            System.out.println(prov1.getP93() + "       " + prov1.getProv());

        }

        // ----------------------解析JSON数据结束

    }



    @Override

    public void onClick(View v)

    {

        switch (v.getId())

        {

        case R.id.btn:

            textView.setText("a");

            break;



        default:

            break;

        }

    }



}

你可能感兴趣的:(json)