Android手动创建和解析Json

概述

现在Android开发中创建和解析Json大都是利用Gson、fastJson等可以映射对象的第三方库,确实非常方便,使用Gson解析可以参考我的另一篇文章使用Gson解析和创建json, 但是还是有需要手动解析的情况。本文详细介绍了不使用第三方库,直接使用Android自带的JsonObject等类来创建和解析json,并准备了一个小Demo.

1 json的格式介绍

1.1 json对象

{"name": "jadyli", "gender": "male"}

对象表示为键值对,数据由逗号分隔,花括号保存对象,使用双引号包裹键名,使用冒号分隔键和值。如果值是String类型且含有双引号或冒号,需要使用”\”转义。

1.2 json数组

[
    {"name": "jadyli", "gender": "male"},
    {"name": "sanqi", "gender": "male"}
]

方括号保存数组。

2 Android自带的Json操作类

2.1 JSONObject

2.1.1 JSONObject基本介绍

Android官方的介绍是

A modifiable set of name/value mappings. Names are unique, non-null strings. Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL. Values may not be null, NaNs, infinities, or of any type not listed here.

一个可变更的键值对映射集合。键是唯一的,非空的字符串。值可能是JSONObjects,JSONArrays,Strings,Booleans,Integers,Longs,Double或NULL中的任意组合。值也有可能不是null,NaNs,infinities,或者任意的这里没有列举的类型。

一些常用的方法如下,参考Android JSONObject类

方法名(参数)描述
get(String name)返回跟键映射的值,如果没找到则抛出异常
getInt(String name)返回int值,如果没找到则抛出异常
getString(String name)返回String值,如果没找到则抛出异常
opt(String name)返回跟键映射的值,如果没找到则返回null
optString(String name, String fallback)返回跟键映射的值,如果没找到则返回方法参数中fallback
optString(String name)返回跟键映射的值,如果没找到则返回空字符串”“
put(String name, Object value)将键映射到值,如果这个对象中存在这个键则会覆盖之前的
put(String name, int value)将键映射到值,如果这个对象中存在这个键则会覆盖之前的
getJSONObject(String name)返回JSONObject,如果没找到则抛出异常
getJSONArray(String name)返回JSONArray值,如果没找到则抛出异常
keys()返回Iterator,这个对象中键的集合迭代器
names()返回JSONArray,这个对象中键的数组
length()返回这个对象中数据条数
has(String name)判断这个对象中是否有这个键的映射
isNull(String name)判断这个对象中是否有这个键的映射,或者判断值为NULL
toString()将这个对象转成json串,比如:{“query”:”Pizza”,”locations”:[94043,90210]}
toString(int indentSpaces)将这个对象转成json串,显示上会增加换行和缩进,方便阅读

可以调用JSONObject()构造方法,创建一个空的JSONObject,也可以调用JSONObject(String json),将json字符串传入。

2.1.2 JSONObject实例

运用上面的方法,已经可以解析和创建一般的json字符串了。以这个json字符串为例。

{"name": "jadyli", "gender": "male", "age": 18}

创建json

JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "jadyli");
jsonObject.put("gender", "male");
jsonObject.put("age", 18);
System.out.println(jsonObject.toString(1));

输出

{“name”:”jadyli”,”gender”:”male”,”age”:18}

解析json

String json = "{\"name\": \"jadyli\", \"gender\": \"male\", \"age\": 18}";
JSONObject jsonObject = new JSONObject(json);
System.out.println("姓名:" + jsonObject.getString("name"));
System.out.println("性别:" + jsonObject.getString("gender"));
System.out.println("年龄:" + jsonObject.getString("age"));

2.2 JSONArray

参考JSONArray
JSONArray的方法和JSONObject基本一致。举个JSONObject和JSONArray同时使用的小例子。

{
  "students": [
    {
      "name": "jadyli",
      "gender": "male",
      "age": 18
    },
    {
      "name": "Juliet",
      "gender": "female",
      "age": 20
    }
  ]
}

创建json

String[] names = {"jadyli", "Juliet"};
String[] genders = {"male", "female"};
int[] ages = {18, 20};
JSONArray students = new JSONArray();
for (int i = 0; i < names.length; i++) {
    JSONObject student = new JSONObject();
    student.put("name", names[i]);
    student.put("gender", genders[i]);
    student.put("age", ages[i]);
    students.put(student);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("students", students);
System.out.println(jsonObject.toString(1));

输出

{“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}

解析json

String json = "{"students":[{"name":"jadyli","gender":"male","age":18},
                         {"name":"Juliet","gender":"female","age":20}]}";
JSONObject jsonObject = new JSONObject(json);
JSONArray students = jsonObject.getJSONArray("students");
for (int i = 0; i < students.length(); i++) {
     JSONObject student = students.getJSONObject(i);
     System.out.println("姓名:" + student.getString("name"));
     System.out.println("性别:" + student.getString("gender"));
     System.out.println("年龄:" + student.getInt("age") + "\n");
}

2.3 JSONStringer

方法参考JSONStringer
我们主要用这个类来创建json。

{
  "students": [
    {
      "name": "jadyli",
      "gender": "male",
      "age": 18
    },
    {
      "name": "Juliet",
      "gender": "female",
      "age": 20
    }
  ]
}
JSONStringer jsonStringer = new JSONStringer();
jsonStringer.object();

jsonStringer.key("students");
jsonStringer.array();
String[] names = {"jadyli", "Juliet"};
String[] genders = {"male", "female"};
int[] ages = {18, 20};
for (int i = 0; i < names.length; i++) {
    jsonStringer.object();
    jsonStringer.key("name");
    jsonStringer.value(names[i]);
    jsonStringer.key("gender");
    jsonStringer.value(genders[i]);
    jsonStringer.key("age");
    jsonStringer.value(ages[i]);
    jsonStringer.endObject();
}
jsonStringer.endArray();

jsonStringer.endObject();

System.out.println(jsonStringer.toString());

输出

{“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}

2.4 JSONTokener

方法参考JSONTokener

这个类主要是用来解析json的。我们使用JSONTokener来解析一下下面的这个json。

{
  "students": [
    {
      "name": "jadyli",
      "gender": "male",
      "age": 18
    },
    {
      "name": "Juliet",
      "gender": "female",
      "age": 20
    }
  ]
}
JSONTokener jsonTokener = new JSONTokener("{\"students\":[" +
                            "{\"name\":\"jadyli\",\"gender\":\"male\",\"age\":18}," +
                            "{\"name\":\"Juliet\",\"gender\":\"female\",\"age\":20}]}");
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
JSONArray students = jsonObject.getJSONArray("students");
for (int i = 0; i < students.length(); i++) {
     JSONObject student = students.getJSONObject(i);
     System.out.println("姓名:" + student.getString("name"));
     System.out.println("性别:" + student.getString("gender"));
     System.out.println("年龄:" + student.getInt("age") + "\n");
}

只是使用nextValue()将json读成了JSONObject。
JSONTokener的主要作用是读取json中的字符,一般不会用到。

System.out.println(jsonTokener.next()); //下一个字符
jsonTokener.skipPast("name"); //定位到name后面
System.out.println(jsonTokener.next(2));//下两个字符

JsonReader

这里的 JsonReader 是指 android.util 包下的,不是 gson 中的。可以直接参考它官方的 demo 。

假设有一段这样的 json 输入流:

[
  {
    "id": 912345678901,
    "text": "How do I read JSON on Android?",
    "geo": null,
    "user": {
      "name": "android_newb",
      "followers_count": 41
    }
  },
  {
    "id": 912345678902,
    "text": "@android_newb just use android.util.JsonReader!",
    "geo": [
      50.454722,
      -104.606667
    ],
    "user": {
      "name": "jesse",
      "followers_count": 2
    }
  }
]

使用 JsonReader 解析上述 json

public List<Message> readJsonStream(InputStream in) throws IOException {
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
    try {
        return readMessagesArray(reader);
    }
    finally {
        reader.close();
    }
}
public List<Message> readMessagesArray(JsonReader reader) throws IOException {
    List<Message> messages = new ArrayList<Message>();
    reader.beginArray();
    while (reader.hasNext()) {
        messages.add(readMessage(reader));
    }
    reader.endArray();
    return messages;
}
public Message readMessage(JsonReader reader) throws IOException {
    long id = -1;
    String text = null;
    User user = null;
    List<double> geo = null;
    reader.beginObject();
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("id")) {
            id = reader.nextlong();
        } else if (name.equals("text")) {
            text = reader.nextString();
        } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
            geo = readDoublesArray(reader);
        } else if (name.equals("user")) {
            user = readUser(reader);
        } else {
            reader.skipValue();
        }
    }
    reader.endObject();
    return new Message(id, text, user, geo);
}
public List<double> readDoublesArray(JsonReader reader) throws IOException {
    List<double> doubles = new ArrayList<double>();
    reader.beginArray();
    while (reader.hasNext()) {
        doubles.add(reader.nextdouble());
    }
    reader.endArray();
    return doubles;
}
public User readUser(JsonReader reader) throws IOException {
    String username = null;
    int followersCount = -1;
    reader.beginObject();
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("name")) {
            username = reader.nextString();
        } else if (name.equals("followers_count")) {
            followersCount = reader.nextint();
        } else {
            reader.skipValue();
        }
    }
    reader.endObject();
    return new User(username, followersCount);
}

关于上述方法的详细介绍请参阅JsonReader

JsonWriter

这里的 JsonWriter 是指 android.util 包下的,不是 gson 中的。可以直接参考它官方的 demo 。

假设有一段这样的 json 输入流:

[
  {
    "id": 912345678901,
    "text": "How do I write JSON on Android?",
    "geo": null,
    "user": {
      "name": "android_newb",
      "followers_count": 41
    }
  },
  {
    "id": 912345678902,
    "text": "@android_newb just use android.util.JsonWriter!",
    "geo": [
      50.454722,
      -104.606667
    ],
    "user": {
      "name": "jesse",
      "followers_count": 2
    }
  }
]

使用 JsonWriter 编写上述 json

public void writeJsonStream(OutputStream out, List<Message> messages) throws IOException {
    JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
    writer.setIndent("  ");
    writeMessagesArray(writer, messages);
    writer.close();
}
public void writeMessagesArray(JsonWriter writer, List<Message> messages) throws IOException {
    writer.beginArray();
    for (Message message : messages) {
        writeMessage(writer, message);
    }
    writer.endArray();
}
public void writeMessage(JsonWriter writer, Message message) throws IOException {
    writer.beginObject();
    writer.name("id").value(message.getId());
    writer.name("text").value(message.getText());
    if (message.getGeo() != null) {
        writer.name("geo");
        writeDoublesArray(writer, message.getGeo());
    } else {
        writer.name("geo").nullValue();
    }
    writer.name("user");
    writeUser(writer, message.getUser());
    writer.endObject();
}
public void writeUser(JsonWriter writer, User user) throws IOException {
    writer.beginObject();
    writer.name("name").value(user.getName());
    writer.name("followers_count").value(user.getFollowersCount());
    writer.endObject();
}
public void writeDoublesArray(JsonWriter writer, List<double> doubles) throws IOException {
    writer.beginArray();
    for (double value : doubles) {
        writer.value(value);
    }
    writer.endArray();
}

关于上述方法的详细介绍请参阅JsonWriter

本文的demo地址

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值