jsonrreader java_利用JsonReade和JsonReader实现json解析和写数据

本文介绍了如何在Android应用中使用系统的JsonReader和JsonWriter来解析和生成JSON数据。通过示例展示了如何读取JSON数组,解析成自定义的MyMessage对象,并通过JsonWriter将MyMessage对象序列化回JSON格式。
摘要由CSDN通过智能技术生成

前面讲过调用谷歌的json包来对json数据进行解析,随着android的发展现在手机系统都是android4.0以上版本了,因此可以直接调用sdk 中的JsonReader来解析json数据了。json数据的解析成现有的类,这些类通常是javaBean类,通过查看官方的文档将其文档的例子完善了下如下:

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

}

}

]

需要解析出来的类:

package com.example.user.myjosn;

import java.util.List;

/**

* Created by user on 2016/10/18.

*/

public class MyMessage {

long id;

String text;

List geo;

User user;

public MyMessage(long id,String text, User user, List geo)

{

this.id= id;

this.user= user;

this.geo = geo;

this.text = text;

}

}

class User

{

public User(String name,int count)

{

this.name= name;

this.followers_count = count;

}

String name;

int followers_count;

}

解析json的类:调用readJsonStream函数就可以解析出该json文件,该解析和xml解析相似,开头分reader.beginArray 和reader.beginObject 第一个是接下来解析一个数组,通常里面嵌套解析一个解析另外个对象的函数,后面一个就是解析对象,然后就是相应的end结束语句,且对象里面含有对象,因此对象的读取是嵌套实现的:

package com.example.user.myjosn;

import android.os.Message;

import android.util.JsonReader;

import android.util.JsonToken;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

/**

* Created by user on 2016/10/18.

*/

public class MyMessageJsonReader {

/*

in 为要读取的文件的输入流

*/

public List readJsonStream(InputStream in) throws IOException {

JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));

try {

return readMessagesArray(reader);

}

finally{

reader.close();

}

}

public List readMessagesArray(JsonReader reader) throws IOException {

List messages = new ArrayList();

reader.beginArray();

while (reader.hasNext()) {

messages.add(readMessage(reader));

}

reader.endArray();

return messages;

}

public MyMessage readMessage(JsonReader reader) throws IOException {

long id = -1;

String text = null;

User user = null;

List 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的值不为空,因为有可能为空

geo = readDoublesArray(reader);

} else if (name.equals("user")) {

user = readUser(reader);

} else {

reader.skipValue();

}

}

reader.endObject();

return new MyMessage(id, text, user, geo);

}

//读取double型的数组,主要是读取geo项的数组

public List readDoublesArray(JsonReader reader) throws IOException {

List doubles = new ArrayList();

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);

}

}

解析完了后得到了list对象,存储的是MyMessage对象,下面我们利用JsonWriter来自己写json数据:写的内容就是上面的得到的list里面的MyMessage对象,写的内容和读的一模一样:下面给出写的类:

package com.example.user.myjosn;

import android.util.JsonWriter;

import java.io.IOException;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.util.List;

/**

* Created by user on 2016/10/18.

*/

public class MyMessageJsonWriter {

public void writeJsonStream(OutputStream out, List 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 messages) throws IOException {

writer.beginArray();

for (Object message : messages) {

writeMessage(writer,(MyMessage) message);

}

writer.endArray();

}

public void writeMessage(JsonWriter writer, MyMessage 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.getFollowers_count());

writer.endObject();

}

public void writeDoublesArray(JsonWriter writer, List doubles) throws IOException {

writer.beginArray();

for (Object value : doubles) {

writer.value((Double)value);

}

writer.endArray();

}

}

主函数Activity:

package com.example.user.myjosn;

import android.content.Context;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

ArrayList list;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//读取data目录下的json数据存储到集合中

try {

InputStream in = new FileInputStream( "data/data/com.example.user.myjosn/files/jsondemo.txt");

MyMessageJsonReader mJson = new MyMessageJsonReader();

list = (ArrayList) mJson.readJsonStream(in);

System.out.println("第一个"+list.get(0).id);

} catch (FileNotFoundException e) {

System.out.println("文件没找到");

e.printStackTrace();

} catch (IOException e) {

System.out.println("读取文件失败");

e.printStackTrace();

}

//将上面得到的MyMessage对象的数据写入成json数据

try {

OutputStream outputStream = openFileOutput("message", Context.MODE_PRIVATE);

MyMessageJsonWriter myMessageJsonWriter = new MyMessageJsonWriter();

myMessageJsonWriter.writeJsonStream(outputStream, list);

} catch (Exception e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值