JSON全面讲解

JSON全面讲解

一、Json简介

    概念:JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。

    优点:

     1)本质就是具有特定格式的字符串

     2JSON完全独立于编程语言

     3JSONXML数据传输的有效性要高出很多,更省流量

    缺点:

语义性较差,不如XML直观

二、JSON数据格式

    整体结构

     1String json1 = “{“id” : “12”,”name” : “Tom”}”

     2String json2 = “[{“id” : “12”,”name” : “Tom”},{“id” : “12”,”name” : “Tom”}]”

    Json对象:{}  -----类似于java中的map集合

     1Json对象的结构:{key1:value1,key2:value2...}

     2key的数据类型:字符串

     3value的数据类型:数值、字符串、nulljson数据[]json对象{}

    Json数组:[] ----类似于javalist集合

     1Json数组的结构:[value1,value2....]

     2value的数据类型:数值、字符串、nulljson数组[]json对象{}

三、JSON解析方向

    将java对象(包括集合)转换为json格式字符串----在服务端应用

    将json格式的字符串转换为java对象(包含集合)----在客户端应用

    Jsonjava之间的转换关系

    (1json对象对应javabean对象

    (2Json数组和java对象构成的list对应

四、JSON解析技术

    Android原生技术

    特点:编程相对麻烦

    数据之间的转换

   1)将json格式的字符串{}转换为java对象

  API

    JSONObjectjson):将json字符串解析为json对象

    Xxx.getXxx(String name) :根据name,在json对象中得到对应的Value

    Xxx.optXxx(String name) :根据name,在json对象中得到对应的Value

    Opt方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值。

    但是get方法会出现空指针异常的情况。

   2)将json格式的字符串[]转换为java对象的List

  API:

    JSONARRAY(String json):json字符串解析为json数组

    Int lenght :得到json数组中元素的个数

   3)复杂json数据解析

其实就是既有json字符串又有json数组

Google没有提供将java转换为json的方法。

 

Gson框架技术

    特点:编码简洁,Google官方推荐

    数据之间转换:

    (1)将json格式的字符串{}转换为java对象

    API:

         <T> T fromJson(String json,Class<T> classofT)

   注意:要求Json对象中的key的名称与java对象对应的类中的属性名要相同

    步骤:

    (a)将Gsonjar包导入的项目中

    (b)创建Gson对象

                   Gson gson = new Gson();

    (c)通过创建的Gson对象调用fromJson()方法,返回该Json数据对应的java对象

                  DataInfo dataInfo = gson.fromJson(json,DataInfo,class);

 

2)将json格式的字符串[]转换为java对象的List

    API:

             fromJson(json,Type typeofT);

   步骤:

      (a)将Gsonjar包导入的项目中

      (b)创建Gson对象

                             Gson gson = new Gson();

      (c)通过创建的Gson对象调用fromJson()方法,返回该Json数据对应的java集合

     List<DataInfo> infos = gson.fromJson(josn,new TypeToken<List<DataInfo>>(){}.getType());

 (3)将java对象转换为json字符串{}

    API

        String toJson(Object src);

   步骤:

     (a)将Gsonjar包导入的项目中

     (b)创建Gson对象

                 Gson gson = new Gson();

     (c)通过创建的Gson对象调用toJson()方法,返回该Json数据

                      DataInfo info = new DataInfo(1,”apple”,250.0,”eggs”);

                      String json = gson.toJson(info);

4)将java对象的List转换为json字符串[]

    API:

               String toJson(Object src);

   步骤:

      (a)将Gsonjar包导入的项目中

      (b)创建Gson对象

                            Gson gson = new Gson();

      (c)通过创建的Gson对象调用toJson()方法,返回该Json数据

                       List<DataInfo> infoList = new ArrayList<>();

                      String json = gson.toJson(infoList);

FastJson技术

    特点:FastJson是一个java语言编写的高性能功能完善的Json库,它采用一种“假定有序快速匹配”的算法,把Json解析的性能提升到极致,是目前java语言中最快的Josn

    数据间转换

1)将json格式的字符串{}转换为java对象

   API:

   <T> T parseObject(String json,Class<T> classOfT);

   步骤:

      (a)将FastJsonjar包导入的项目中

      (bJSON调用parseObject()方法,获取转换后的java对象

             DataInfo dataInfo = JSON.parseObject(json,DataInfo.class);

2)将json格式的字符串[]转换为java对象的List

  API:

            List<T> parseArray(String json,Class<T> classOfT);

  步骤:

       (a)将FastJsonjar包导入的项目中

       (bJSON调用parseArray()方法,获取转换后的java集合

              List<DataInfo> infoList = new ArrayList(json,DataInfo.class);

3)将java对象转换为json字符串{}

    API:

          String toJSONString(Object object);

    步骤:

      (a)将FastJsonjar包导入的项目中

      (bJSON调用toJSONString()方法,获取转换后的json数据

                 DataInfo  dataInfo = new DataInfo(1,”apple”,2,”eggs”);

                 String json = JSON.toJSONString(dataInfo);

4)将java对象的List转换为json字符串[]

    API:

          String toJSONString(Object object);

   步骤:

        (a)FastJsonjar包导入的项目中

        (b)JSON调用toJSONString()方法,获取转换后的json数据

                  List<DataInfo> infoList = new ArrayList();

             DataInfo zhangsan = new DataInfo(1,zhangsan);

                   DataInfo lisi = new DataInfo(2,lisi);

                        infoList.add(zhangsan);

                       infoList.add( lisi );

                String json = JSON.toString(infoList);

最后说一下根据不同的json数据(获取到的json数据用HI JSON 进行格式化,就会很清晰json数据的结构),JavaBean类的编写原则:

(1)遇到{}就写一个类

(2)遇到[]就写一个集合一般写ArrayLsit

(3)什么符号都没有,就是基本数据类型

(4)尽量把javaBean对象定义广一些

(5)有的人说我不想写那个,太烦了,好吧,GsonFormat工具可以自动生成javaBean


先看一个app展示:



 再看一下工程目录:(使用的是MVP模式)


 接下来直接上代码:

Model层:

public class DataInfo {

    /**
     * id : 1
     * name : xue
     */

    private String id;
    private String name;

    public DataInfo(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public DataInfo() {}

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "DataInfo{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
public interface IDataInfo {
    //提供数据的接口
    DataInfo sendDataInfo();
}

public class IDataInfoImpl implements IDataInfo {
    @Override
    public DataInfo sendDataInfo() {
        DataInfo dataInfo = new DataInfo();
        return dataInfo;
    }
}

public class DataInfoComplex {
    @Override
    public String toString() {
        return "DataInfoComplex{" +
                "data=" + data +
                ", code='" + code + '\'' +
                ", msg='" + msg + '\'' +
                '}';
    }

    /**
     * data : {"count":10,"items":[{"id":1,"title":"苹果"},{"id":2,"title":"香蕉"},{"id":3,"title":"葡萄"}]}
     * code : 1000
     * msg : success
     */

    private DataBean data;
    private String code;
    private String msg;

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public static class DataBean {
        @Override
        public String toString() {
            return "DataBean{" +
                    "count=" + count +
                    ", items=" + items +
                    '}';
        }

        /**
         * count : 10
         * items : [{"id":1,"title":"苹果"},{"id":2,"title":"香蕉"},{"id":3,"title":"葡萄"}]
         */

        private int count;
        private List<ItemsBean> items;

        public int getCount() {
            return count;
        }

        public void setCount(int count) {
            this.count = count;
        }

        public List<ItemsBean> getItems() {
            return items;
        }

        public void setItems(List<ItemsBean> items) {
            this.items = items;
        }

        public static class ItemsBean {
            @Override
            public String toString() {
                return "ItemsBean{" +
                        "id=" + id +
                        ", title='" + title + '\'' +
                        '}';
            }

            /**
             * id : 1
             * title : 苹果
             */

            private int id;
            private String title;

            public int getId() {
                return id;
            }

            public void setId(int id) {
                this.id = id;
            }

            public String getTitle() {
                return title;
            }

            public void setTitle(String title) {
                this.title = title;
            }
        }
    }
}
public interface IDataInfoComplex {

    DataInfoComplex sendDataInfo();
}
public class IDataInfoComplexImpl implements IDataInfoComplex {
    @Override
    public DataInfoComplex sendDataInfo() {
        DataInfoComplex dataInfoComplex = new DataInfoComplex();

        return dataInfoComplex;

    }
}

Presenter层:

public interface JsonObjectIPresenter {

    String deliverTurnedData(); //处理完数据需要返回给View
    String deliverOrignalData();

    String deliverJsonListTurnedData();
    String deliverJsonListOrignalData();

    String deliverComplexJsonTurnedData();
    String deliverComplexJsonOrignalData();
}
public class JsonObjectIPresenterImpl implements JsonObjectIPresenter {
    private JsonObjectIView mJsonObjectIView;
    private IDataInfoImpl mIDataInfoImpl = new IDataInfoImpl();
    private String mName;
    private String mId;


    public JsonObjectIPresenterImpl(JsonObjectIView jsonObjectIView) {
        this.mJsonObjectIView = jsonObjectIView;
    }

    @Override
    public String deliverTurnedData() {

        DataInfo dataInfo = null;
        String json = mJsonObjectIView.getData();
        try {
            JSONObject jsonObject = new JSONObject(json);
            mName = jsonObject.optString("name");
            mId = jsonObject.optString("id");
            //获取对象,并封装对象
            dataInfo = mIDataInfoImpl.sendDataInfo();
            dataInfo.setId(mId);
            dataInfo.setName(mName);

        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
        return dataInfo.toString();
    }

    @Override
    public String deliverOrignalData() {
        String json = mJsonObjectIView.getData();
        return json;
    }

    @Override
    public String deliverJsonListTurnedData() {
        List<DataInfo> list = new ArrayList<>();
        DataInfo dataInfolist = null;
        String jsonListData = mJsonObjectIView.getJsonListData();
        try {
            JSONArray jsonArray = new JSONArray(jsonListData);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String id = jsonObject.optString("id");
                String name = jsonObject.optString("name");
                dataInfolist = mIDataInfoImpl.sendDataInfo();

                dataInfolist.setId(id);
                dataInfolist.setName(name);
                list.add(dataInfolist);
            }
        } catch (JSONException e) {
            e.printStackTrace();

        }

        return list.toString();
    }

    @Override
    public String deliverJsonListOrignalData() {
        String jsonListData = mJsonObjectIView.getJsonListData();
        return jsonListData;
    }

    @Override
    public String deliverComplexJsonTurnedData() {
        //获取需要解析的json数据
        String complexJsonData = mJsonObjectIView.getComplexJsonData();
        //获取DataInfoComplex对象,用来封装json数据
        DataInfoComplex dataInfoComplex = new DataInfoComplex();
        //解析json

        try {
            //第一层解析
            JSONObject jsonObject = new JSONObject(complexJsonData);
            String code = jsonObject.optString("code");
            JSONObject data = jsonObject.optJSONObject("data");
            String msg = jsonObject.optString("msg");

            //第一层数据封装
            dataInfoComplex.setCode(code);
            //这里需要获取到data对应的对象
            DataInfoComplex.DataBean dataBean = new DataInfoComplex.DataBean();
            dataInfoComplex.setData(dataBean);
            dataInfoComplex.setMsg(msg);

            //第二层解析
            int count = data.optInt("count");
            JSONArray items = data.optJSONArray("items");

            //第二层封装

            dataBean.setCount(count);
            List<DataInfoComplex.DataBean.ItemsBean> itemsList = new ArrayList<>();
            dataBean.setItems(itemsList);
            //第三层解析
            for (int i = 0; i < items.length(); i++) {
                JSONObject jsonObject1 = items.optJSONObject(i);
                int id = jsonObject1.optInt("id");
                String title = jsonObject1.optString("title");

                //第三层数据封装
                DataInfoComplex.DataBean.ItemsBean itemsBean = new DataInfoComplex.DataBean.ItemsBean();
                itemsBean.setId(id);
                itemsBean.setTitle(title);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return dataInfoComplex.toString();
    }

    @Override
    public String deliverComplexJsonOrignalData() {
        String complexJsonData = mJsonObjectIView.getComplexJsonData();
        return complexJsonData;
    }
}

public interface GsonIPresenter {

    String deliverTurnedData(); //处理完数据需要返回给View
    String deliverOrignalData();

    String deliverJsonListTurnedData();
    String deliverJsonListOrignalData();
}
public class GsonIPresenterImpl implements GsonIPresenter {
    private GsonIView mGsonIView;
   // private IDataInfoImpl mIDataInfoImpl = new IDataInfoImpl();

    public GsonIPresenterImpl(GsonIView gsonIView) {
        this.mGsonIView = gsonIView;
    }

    //传递解析后数据的方法
    @Override
    public String deliverTurnedData() {
        //获取json
        String jsonData = mGsonIView.getJsonData();
        //解析json
        Gson gson = new Gson();
        //直接将json字符串印射成一个对象
        DataInfo dataInfo = gson.fromJson(jsonData, DataInfo.class);
        return dataInfo.toString();
    }

    @Override
    public String deliverOrignalData() {
        //获取json
        String jsonData = mGsonIView.getJsonData();
        return jsonData;

    }

    @Override
    public String deliverJsonListTurnedData() {
        //获取json数据
        String jsonArrayData = mGsonIView.getJsonArrayData();
        //解析json数组
        Gson gson = new Gson();
        List<DataInfo> dataInfo = gson.fromJson(jsonArrayData, new TypeToken<List<DataInfo>>() {
        }.getType());
        return dataInfo.toString();
    }

    @Override
    public String deliverJsonListOrignalData() {
        //获取json数据
        String jsonArrayData = mGsonIView.getJsonArrayData();
        return jsonArrayData;
    }
}

public interface FastJsonIPresenter {
    String deliverTurnedData(); //处理完数据需要返回给View
    String deliverOrignalData();

    String deliverJsonListTurnedData();
    String deliverJsonListOrignalData();
}
public class FastJsonIPresenterImpl implements FastJsonIPresenter {

    private FastJsonIView mFastJsonIView;
    public FastJsonIPresenterImpl(FastJsonIView fastJsonIView) {
          this.mFastJsonIView = fastJsonIView;
    }
    @Override
    public String deliverTurnedData() {
        //获取json
        String jsonData = mFastJsonIView.getJsonData();
        //解析json (就一句话搞定啊,感动哭了。。。)
        DataInfo dataInfo = JSON.parseObject(jsonData, DataInfo.class);
        return dataInfo.toString();
    }

    @Override
    public String deliverOrignalData() {
        //获取json
        String jsonData = mFastJsonIView.getJsonData();
        return jsonData;
    }

    @Override
    public String deliverJsonListTurnedData() {
        //获取json数组
        String jsonArrayData = mFastJsonIView.getJsonArrayData();
        //解析json数组 (还是一句话搞定啊,阿里粑粑厉害啊!)
        List<DataInfo> dataInfos = JSON.parseArray(jsonArrayData, DataInfo.class);
        return dataInfos.toString();
    }

    @Override
    public String deliverJsonListOrignalData() {
        //获取json数组
        String jsonArrayData = mFastJsonIView.getJsonArrayData();
        return jsonArrayData;
    }
}

View层:

public class BaseActivity extends AppCompatActivity {

    public void JumpToActivity (Class clazz) {
        Intent intent = new Intent(this,clazz);
        startActivity(intent);
    }
}
public class MainActivity extends BaseActivity {

    @InjectView(R.id.btn_JsonObject)
    Button btnJsonObject;
    @InjectView(R.id.btn_Gson)
    Button btnGson;
    @InjectView(R.id.btn_FastJson)
    Button btnFastJson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
    }

    @OnClick({R.id.btn_JsonObject, R.id.btn_Gson, R.id.btn_FastJson})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_JsonObject:
                JumpToActivity(JsonObjectActivity.class);
                break;
            case R.id.btn_Gson:
                JumpToActivity(GsonActivity.class);
                break;
            case R.id.btn_FastJson:
                JumpToActivity(FastJsonActivity.class);
                break;
        }
    }
}
public interface JsonObjectIView {
    String getData();
    String getJsonListData();
    String getComplexJsonData();
}
public class JsonObjectActivity extends AppCompatActivity implements JsonObjectIView {

    @InjectView(R.id.btn_JsonToJavaObject)
    Button   btnJsonToJavaObject;
    @InjectView(R.id.btn_JsonToJavaList)
    Button   btnJsonToJavaList;
    @InjectView(R.id.btn_ComplexJsonToJavaObject)
    Button   btnComplexJsonToJavaObject;
    @InjectView(R.id.tv_orginal)
    TextView tvOrginal;
    @InjectView(R.id.tv_parsed)
    TextView tvParsed;
    private JsonObjectIPresenter mJsonObjectIPresenter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_json_object);
        ButterKnife.inject(this);
        mJsonObjectIPresenter = new JsonObjectIPresenterImpl(this);
    }

    @OnClick({R.id.btn_JsonToJavaObject, R.id.btn_JsonToJavaList, R.id.btn_ComplexJsonToJavaObject})
    public void onClick(View view) {
        switch (view.getId()) {
            //Json对象转换成Java对象
            case R.id.btn_JsonToJavaObject:
                String orignalData = mJsonObjectIPresenter.deliverOrignalData();
                tvOrginal.setText(orignalData);
                String turnedData = mJsonObjectIPresenter.deliverTurnedData();
                tvParsed.setText(turnedData);
                break;
            //Json对象转换成Java集合
            case R.id.btn_JsonToJavaList:
                String deliverJsonListTurnedData =
                        mJsonObjectIPresenter.deliverJsonListTurnedData();
                tvParsed.setText(deliverJsonListTurnedData);
                String deliverJsonListOrigalData = mJsonObjectIPresenter.deliverJsonListOrignalData();
                tvOrginal.setText(deliverJsonListOrigalData);
                break;
            //将一个同时包含有对象和数组的json数据转换成Java对象
            case R.id.btn_ComplexJsonToJavaObject:
                String complexJsonTurnedData = mJsonObjectIPresenter.deliverComplexJsonTurnedData();
                tvParsed.setText(complexJsonTurnedData);
                String complexJsonOrignalData = mJsonObjectIPresenter.deliverComplexJsonOrignalData();
                tvOrginal.setText(complexJsonOrignalData);
                break;

        }
    }

    @Override
    public String getData() {
        String json = "{\"id\":\"1\",\"name\":\"xue\"}";
        return json;
    }

    @Override
    public String getJsonListData() {
        String jsonList = "[{\"id\":\"1\",\"name\":\"xue\"},{\"id\":\"2\",\"name\":\"guo\"}]";
        return jsonList;
    }

    @Override
    public String getComplexJsonData() {
        String complexJson = "{\"data\":{\"count\":10,\"items\":[{\"id\":1,\"title\":\"苹果\"}," +
                "{\"id\":2,\"title\":\"香蕉\"}," +
                "{\"id\":3,\"title\":\"葡萄\"}]},\"code\":\"1000\",\"msg\":\"success\"}";
        return complexJson;
    }
}
public interface GsonIView {
    String getJsonData();
    String getJsonArrayData();
}
public class GsonActivity extends AppCompatActivity implements GsonIView{

    @InjectView(R.id.btn_gson_toJavaObject)
    Button   btnGsonToJavaObject;
    @InjectView(R.id.btn_gson_toJavaList)
    Button   btnGsonToJavaList;
    @InjectView(R.id.tv_native_orignal)
    TextView tvNativeOrignal;
    @InjectView(R.id.tv_native_last)
    TextView tvNativeLast;
      private GsonIPresenter mGsonIPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gson);
        ButterKnife.inject(this);
      mGsonIPresenter = new GsonIPresenterImpl(this);
    }

    @OnClick({R.id.btn_gson_toJavaObject, R.id.btn_gson_toJavaList})
    public void onClick(View view) {
        switch (view.getId()) {
            //Json字符串转换成Java对象
            case R.id.btn_gson_toJavaObject:
                String turnedData = mGsonIPresenter.deliverTurnedData();
                  tvNativeLast.setText(turnedData);
                String orignalData = mGsonIPresenter.deliverOrignalData();
                tvNativeOrignal.setText(orignalData);
                break;
            //Json数组转换成Java对象的集合
            case R.id.btn_gson_toJavaList:
                String listTurnedData = mGsonIPresenter.deliverJsonListTurnedData();
                tvNativeLast.setText(listTurnedData);
                String listOrignalData = mGsonIPresenter.deliverJsonListOrignalData();
                tvNativeOrignal.setText(listOrignalData);
                break;
        }
    }

    @Override
    public String getJsonData() {
        String json = "{\"id\":\"1\",\"name\":\"xue\"}";
        return json;
    }

    @Override
    public String getJsonArrayData() {
        String json = "[{\"id\":\"1\",\"name\":\"xue\"}," +
                "{\"id\":\"2\",\"name\":\"guo\"}]";
        return json;
    }
}
public interface FastJsonIView {
    String getJsonData();
    String getJsonArrayData();
}
public class FastJsonActivity extends AppCompatActivity implements FastJsonIView {

    @InjectView(R.id.btn_fastJson_toJavaObject)
    Button   btnFastJsonToJavaObject;
    @InjectView(R.id.btn_fastJson_toJavaList)
    Button   btnFastJsonToJavaList;
    @InjectView(R.id.tv_orignal)
    TextView tvOrignal;
    @InjectView(R.id.tv_turned)
    TextView tvTurned;
    private FastJsonIPresenter mFastJsonIPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fast_json);
        ButterKnife.inject(this);
        mFastJsonIPresenter = new FastJsonIPresenterImpl(this);
    }

    @OnClick({R.id.btn_fastJson_toJavaObject, R.id.btn_fastJson_toJavaList})
    public void onClick(View view) {
        switch (view.getId()) {
            //json字符串转换为Java对象
            case R.id.btn_fastJson_toJavaObject:
                String turnedData = mFastJsonIPresenter.deliverTurnedData();
                tvTurned.setText(turnedData);
                String orignalData = mFastJsonIPresenter.deliverOrignalData();
                tvOrignal.setText(orignalData);

                break;
            //json数组转换为Java对象的集合
            case R.id.btn_fastJson_toJavaList:
                String listTurnedData = mFastJsonIPresenter.deliverJsonListTurnedData();
                tvTurned.setText(listTurnedData);
                String listOrignalData = mFastJsonIPresenter.deliverJsonListOrignalData();
                tvOrignal.setText(listOrignalData);
                break;
        }
    }

    @Override
    public String getJsonData() {
        String json = "{\"id\":\"1\",\"name\":\"xue\"}";
        return json;
    }

    @Override
    public String getJsonArrayData() {
        String json = "[{\"id\":\"1\",\"name\":\"xue\"}," +
                "{\"id\":\"2\",\"name\":\"guo\"}]";
        return json;
    }
}
累死我了,写了三个小时,一动不动。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值