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