Gson解析Json数据

最近做个项目,需要校验服务器日志(json)中每个字段的值,本来是用正则表达式来取字段,然后进行分割来取值的,结果在版本迭代时,产品要求添加几个字段,导致好些的正则表达式需要重新写。后来与开发讨论了下,发现原来用gson来解析更为简单。


接下来我会介绍通过gson解析json数据如下面我们要解析的一个json数据:
{"a":"100","b":[{"b1":"b_value11","b2":"b_value12"},{"b1":"b_value21","b2":"b_value22"}],"c": {"c1":"c_value1","c2":"c_value2"}}
这样的格式看起来比较麻烦,可以用在线解析json的网站来解析一下:点我跳转

{
    "a": "100",
    "b": [
        {
            "b1": "b_value11",
            "b2": "b_value12"
        },
        {
            "b1": "b_value21",
            "b2": "b_value22"
        }
    ],
    "c": {
        "c1": "c_value1",
        "c2": "c_value2"
    }
}

接着我们需要定义一个序列化的JsonBean类(解析json数据时根据这个类来解析),为了看起来更清晰,这里使用的内部类的形式。

class JsonBean {
	private String a;
	private List<B> b;
	private C c;

	public String getA() {
		return a;
	}

	public List<B> getB() {
		return b;
	}

	public C getC() {
		return c;
	}

	@Override
	public String toString() {
		return "JsonBean [a=" + a + ", b=" + b + ", c=" + c + "]";
	}

	public static class B {

		public String b1;

		public String b2;

		public String getb1() {
			return b1;
		}

		public String getb2() {
			return b2;
		}

		@Override
		public String toString() {
			return "B [b1=" + b1 + ", b2=" + b2 + "]";
		}

	}

	public static class C {
		public String c1;
		public String c2;

		public String getc1() {
			return c1;
		}

		public String getc2() {
			return c2;
		}

		@Override
		public String toString() {
			return "C [c1=" + c1 + ", c2=" + c2 + "]";
		}

	}
}

然后直接在JsonBean里面取就可以了你需要的数据就可以了。

Gson gson = new Gson();
java.lang.reflect.Type type = new TypeToken<JsonBean>(){}.getType();
JsonBean jsonBean = gson.fromJson(json, type);


定义JsonBean需要注意以下几点:
1. 内部嵌套的用[]括起来的部分是一个List,就定义为 public List<B> b。
2. 用{}嵌套的为字符串组,就定义为 public C c。
3. 内部嵌套的类必须是static的,要不然解析会出错。
4. 类里面的属性名必须跟Json字段里面的Key是一模一样的。

下面是完整代码:

我将json字符串放在一个txt文件中,模拟去服务器拿数据

import gosonTest.JsonBean.B;
import gosonTest.JsonBean.C;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class JsonBeanTest {
	public static void main(String[] args) {
		String json = readFile("C:\\Users\\Administrator\\Desktop\\json.txt");
		Gson gson = new Gson();
		java.lang.reflect.Type type = new TypeToken<JsonBean>(){}.getType();
		JsonBean jsonBean = gson.fromJson(json, type);
		
		System.out.println(jsonBean.toString());
		String a = jsonBean.getA();
		System.out.println(a);
		List<B> b = jsonBean.getB();
		for (int i = 0; i < b.size(); i++) {
			//打印b
			System.out.println(b.get(i));
			//打印b中的b1的值
			System.out.println(b.get(i).b1);
		}
		C c = jsonBean.getC();
		//打印c
		System.out.println(c);
		//打印c中的c1的值
		System.out.println(c.getc1());
	}

	public static String readFile(String path) {
		StringBuffer sb = null;
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(path));
			sb = new StringBuffer();

			String line = "";
			while ((line = br.readLine()) != null) {
				sb.append(line + "\r\n");
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		String result = sb.toString();
		return result;

	}

}

class JsonBean {
	private String a;
	private List<B> b;
	private C c;

	public String getA() {
		return a;
	}

	public List<B> getB() {
		return b;
	}

	public C getC() {
		return c;
	}

	@Override
	public String toString() {
		return "JsonBean [a=" + a + ", b=" + b + ", c=" + c + "]";
	}

	public static class B {

		public String b1;

		public String b2;

		public String getb1() {
			return b1;
		}

		public String getb2() {
			return b2;
		}

		@Override
		public String toString() {
			return "B [b1=" + b1 + ", b2=" + b2 + "]";
		}

	}

	public static class C {
		public String c1;
		public String c2;

		public String getc1() {
			return c1;
		}

		public String getc2() {
			return c2;
		}

		@Override
		public String toString() {
			return "C [c1=" + c1 + ", c2=" + c2 + "]";
		}

	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值