最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android解析JSON數(shù)據(jù)

 更新時(shí)間:2016年03月18日 09:39:29   投稿:hebedich  
本文給大家介紹的是在Android中解析json數(shù)據(jù)的方法的幾種方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下

JSONObject的使用

 一、 JSON對(duì)象的使用:

String content = "{'username': 'linux', 'password': '123456'}";
JSONObject jsonObject = new JSONObject(content);
String username = jsonObject.getString("username");
String password = jsonObject.getString("password");

二、 JSON數(shù)組的使用:

String jsonContent = "[{'user': '劉力', 'age': 21, 'femal': true}, "
            + "{'user': 'chen', 'age': 20, 'femal': false}]";
JSONArray jsonArray = new JSONArray(jsonContent);
for (int i = 0; i < jsonArray.length(); i++) {
   JSONObject object = jsonArray.getJSONObject(i);
   System.out.print(object.getString("user") + " ");
   System.out.print(object.getInt("age") + " ");
   System.out.print(object.getBoolean("femal") + " ");
   System.out.println();
}

三、 JSON數(shù)組與JSON對(duì)象混合使用

String jsonString = "[{'user': 'tomhu', 'age': 21, " + "'info': {'adress': 'hubai', 'sex': 'femal'}}, "
          + "{'user': 'chen', 'age': 20, " + "'info': {'adress': 'hunan', 'sex': 'male'}}]";
JSONArray jsonArrays = new JSONArray(jsonString);
for (int i = 0; i < jsonArrays.length(); i++) {
  JSONObject objects = jsonArrays.getJSONObject(i);
  System.out.print(objects.getString("user") + " ");
  System.out.print(objects.getInt("age") + " ");
  System.out.print(objects.getJSONObject("info").getString("adress") + " ");
  System.out.print(objects.getJSONObject("info").getString("sex") + " ");
  System.out.println();
}

四、 JSON數(shù)組中存儲(chǔ)對(duì)象

Person person = new Person();
person.setUsername("linux" );
person.setPassword("123456" );
JSONArray jsonArray = new JSONArray();
jsonArray.put(0, person );
jsonArray.put(1, "I love you" );

// String username = jsonArray.getJSONObject(0).getString("username"); 錯(cuò)誤的寫法
Person user = (Person) jsonArray.get(0);
System.out.println("username: " + user.getUsername());

JSONObject的原理

JsonObject的存儲(chǔ)與取出

一、 JSONObject里面維護(hù)了一個(gè)LinkedHashMap,當(dāng)生成一個(gè)無(wú)參數(shù)的JSONObject,實(shí)質(zhì)是初始化了一個(gè)Map:

private final LinkedHashMap<String, Object> nameValuePairs;
public JSONObject() {
  nameValuePairs = new LinkedHashMap<String, Object>();
}

 二、 當(dāng)JSONObject增加數(shù)據(jù),實(shí)質(zhì)上把數(shù)據(jù)的鍵值對(duì)方法存放在上述的Map中:

public JSONObject put(String name, boolean value) throws JSONException {
  nameValuePairs.put(checkName(name), value);
  return this;
}

三、 從JSONObject中取出數(shù)據(jù),很容易想到的就是從Map取出了:

public String getString(String name) throws JSONException {
  Object object = get(name); // get()方法就是執(zhí)行Object result = nameValuePairs.get(name);
  String result = JSON.toString(object);
  if (result == null) {
    throw JSON.typeMismatch(name, object, "String");
  }
  return result;
}

JsonObject的解析過程

一、 JsonObject還有一個(gè)帶參數(shù)的構(gòu)造函數(shù):常用的是傳遞一個(gè)String類型的參數(shù)

public JSONObject(String json) throws JSONException {
  this(new JSONTokener(json));
}

二、 跟進(jìn)去,發(fā)現(xiàn)主要執(zhí)行的是JSONTokener的nextValue()方法,在這個(gè)方法中主要是對(duì)數(shù)據(jù)進(jìn)行解析;

public Object nextValue() throws JSONException {
  int c = nextCleanInternal();
  switch (c) {
    case -1:
      throw syntaxError("End of input");

    case '{':
      return readObject();

    case '[':
      return readArray();

    case '\'':
    case '"':
      return nextString((char) c);

    default:
      pos--;
      return readLiteral();
  }
}

在nextCleanInternal方法中,它會(huì)從頭到尾的逐個(gè)字符的解析,對(duì)于一些字符做一些處理。例如空格,換行,轉(zhuǎn)義符等!
當(dāng)解析到[表示開始一個(gè)對(duì)象的讀取,當(dāng)解析到{表示一個(gè)數(shù)組的讀取

三、 在readObject方法中,仍然是調(diào)用nextCleanInternal()方法,逐個(gè)得到解析的字符,下到解析到}.下面貼出重要代碼

int first = nextCleanInternal(); // 得到解析的字符
if (first == '}') {
  return result;
} else if (first != -1) {
  pos--;
}
.......
while (true) {
  Object name = nextValue(); // 解析得到鍵
  
  int separator = nextCleanInternal();
  if (separator != ':' && separator != '=') {
    throw syntaxError("Expected ':' after " + name);
  }
  if (pos < in.length() && in.charAt(pos) == '>') {
    pos++;
  }

  result.put((String) name, nextValue()); // 將解析得到的鍵值對(duì),存放在map當(dāng)中

  switch (nextCleanInternal()) {
    case '}':
      return result;
    case ';':
    case ',':
      continue;
    default:
      throw syntaxError("Unterminated object");
  }
}

四、 nextValue方法比較關(guān)鍵,它流轉(zhuǎn)解析的大部分工作!在nextValue中有一個(gè)readLiteral方法,針對(duì)一些類型做處理,得到解析之后的結(jié)果:

private Object readLiteral() throws JSONException {
  String literal = nextToInternal("{}[]/\\:,=;# \t\f");

  if (literal.length() == 0) {
    throw syntaxError("Expected literal value");
  } else if ("null".equalsIgnoreCase(literal)) {
    return JSONObject.NULL;
  } else if ("true".equalsIgnoreCase(literal)) {
    return Boolean.TRUE;
  } else if ("false".equalsIgnoreCase(literal)) {
    return Boolean.FALSE;
  }

  /* try to parse as an integral type... */
  if (literal.indexOf('.') == -1) {
    int base = 10;
    String number = literal;
    if (number.startsWith("0x") || number.startsWith("0X")) {
      number = number.substring(2);
      base = 16;
    } else if (number.startsWith("0") && number.length() > 1) {
      number = number.substring(1);
      base = 8;
    }
    try {
      long longValue = Long.parseLong(number, base);
      if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) {
        return (int) longValue;
      } else {
        return longValue;
      }
    } catch (NumberFormatException e) {
      /*
       * This only happens for integral numbers greater than
       * Long.MAX_VALUE, numbers in exponential form (5e-10) and
       * unquoted strings. Fall through to try floating point.
       */
    }
  }

  /* ...next try to parse as a floating point... */
  try {
    return Double.valueOf(literal);
  } catch (NumberFormatException ignored) {
  }

  /* ... finally give up. We have an unquoted string */
  return new String(literal); // a new string avoids leaking memory
}

五、至于JSONArray的解析與JsonObject的解析過程是一樣的,它里面維護(hù)的是一個(gè)List:

private final List<Object> values;
public JSONArray(JSONTokener readFrom) throws JSONException {
  Object object = readFrom.nextValue();
  if (object instanceof JSONArray) {
    values = ((JSONArray) object).values;
  } else {
    throw JSON.typeMismatch(object, "JSONArray");
  }
}

Gson的使用

一、我們?cè)跍y(cè)試當(dāng)中先加入一個(gè)Person類,方便測(cè)試:

package com.tomhu.test;

public class Person {
  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;
  }
}

二、 gson把對(duì)象轉(zhuǎn)換成JSON格式

Gson gson = new Gson();
Person person = new Person();
person.setName("linux");
person.setAge(23);
String str = gson.toJson(person);
System.out.println(str);

打印結(jié)果:  {"name":"linux","age":23}

三、 gson把json格式解析成對(duì)象

String jsonData = "{'name':'劉力','age':19}";
Person person = gson.fromJson(jsonData, Person.class);
System.out.println(person.getName() + ", " + person.getAge());

打印結(jié)果: 劉力, 19

四、 gson把List對(duì)象解析成Json格式:

Gson gson = new Gson();
List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < 2; i++) {
   Person p = new Person();
   p.setName("name" + i);
   p.setAge(i * 5);
   persons.add(p);
}
String str = gson.toJson(persons);
System.out.println(str);

打印結(jié)果: [{"name":"name0","age":0},{"name":"name1","age":5}]

五、 gson把Json格式解析成List對(duì)象:

Gson gson = new Gson();
String str = "[{'name':'linux','age':10},{'name':'huhx','age':22}]";
List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
for (int i = 0; i < ps.size(); i++) {
  Person person = ps.get(i);
  System.out.print("name: " + person.getName() + " age: " + person.getAge());
}

打印結(jié)果:name: linux age: 10 name: huhx age: 22

相關(guān)文章

  • Android四大組件:Activity/Service/Broadcast/ContentProvider作用示例

    Android四大組件:Activity/Service/Broadcast/ContentProvider作用示例

    Android是一種基于Linux,自由及開放源代碼的操作系統(tǒng),Android分為四個(gè)層,從高層到底層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層和Linux內(nèi)核層,Android有四大基本組件:Activity、Service服務(wù)、BroadcastReceiver廣播接收器、Content Provider內(nèi)容提供者
    2023-11-11
  • Android打開手機(jī)相冊(cè)獲取圖片路徑

    Android打開手機(jī)相冊(cè)獲取圖片路徑

    這篇文章主要為大家詳細(xì)介紹了Android打開手機(jī)相冊(cè)獲取圖片路徑,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Android實(shí)現(xiàn)聯(lián)動(dòng)下拉框二級(jí)地市聯(lián)動(dòng)下拉框功能

    Android實(shí)現(xiàn)聯(lián)動(dòng)下拉框二級(jí)地市聯(lián)動(dòng)下拉框功能

    這篇文章主要介紹了Android實(shí)現(xiàn)聯(lián)動(dòng)下拉框二級(jí)地市聯(lián)動(dòng)下拉框功能,本文給大家分享思路步驟,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-12-12
  • 淺析Activity之間的相互調(diào)用

    淺析Activity之間的相互調(diào)用

    本篇文章是對(duì)android中Activity之間的相互調(diào)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Android中的Looper對(duì)象詳細(xì)介紹

    Android中的Looper對(duì)象詳細(xì)介紹

    這篇文章主要介紹了Android中的Looper對(duì)象,需要的朋友可以參考下
    2014-02-02
  • Android自定義Dialog的2種常見方法

    Android自定義Dialog的2種常見方法

    這篇文章主要分享了Android自定義Dialog的2種常見方法,大多數(shù)中,使用系統(tǒng)內(nèi)置的dialog并不能滿足UE的設(shè)計(jì)需要,關(guān)于兩種方法下面文章將詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Android仿百度壁紙客戶端之搭建主框架(一)

    Android仿百度壁紙客戶端之搭建主框架(一)

    這篇文章主要介紹了Android仿百度壁紙客戶端,搭建主框架,自定義Tab+ViewPager+Fragment,具有一定的實(shí)用性,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android實(shí)現(xiàn)簡(jiǎn)單卡片布局

    Android實(shí)現(xiàn)簡(jiǎn)單卡片布局

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)卡片布局的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android中使用SDcard讀取文件

    Android中使用SDcard讀取文件

    這篇文章主要介紹了Android中使用SDcard讀取文件的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Android TextView漸變顏色和方向及動(dòng)畫效果的設(shè)置詳解

    Android TextView漸變顏色和方向及動(dòng)畫效果的設(shè)置詳解

    TextView的在安卓中可以理解為一個(gè)文本視圖控件,Android的視圖控件的基類是View類,可以理解的TextView是View的子類。我們通常在.XML布局文件中會(huì)為文本視圖控件指定各種屬性來(lái)設(shè)置它的樣式,今天我們要講的當(dāng)然不是傳統(tǒng)常見的那種,將會(huì)帶有漸變顏色和方向及動(dòng)畫效果
    2021-11-11

最新評(píng)論

耒阳市| 榆社县| 宾川县| 巫溪县| 青川县| 砀山县| 镇平县| 西乌珠穆沁旗| 保山市| 东乡县| 武安市| 修武县| 怀来县| 娄底市| 鹿泉市| 贵溪市| 青神县| 宽甸| 穆棱市| 会东县| 平山县| 海晏县| 博野县| 乌海市| 富锦市| 大厂| 翁牛特旗| 图木舒克市| 鹤山市| 洛扎县| 资阳市| 肥乡县| 专栏| 乐都县| 延津县| 垦利县| 盘山县| 武邑县| 休宁县| 凌源市| 远安县|