JAVA中进行JSON解析
前言
Java中进行JSON解析主要有两种较为常用的方法,一种是用Gson进行解析,另一种是用fastjson进行解析,前者是谷歌的,后者是阿里的。
正文
为了方便,先写个内部类出来,然后生成一段JSON格式的字符串
public class Demo5 {
public static void main(String[] args) {
// 创建一个景点对象
Attractions attractions = new Attractions();
attractions.setName("东方明珠塔");
attractions.setLocation("浦东新区陆家嘴");
attractions.setPrice(99.9);
/**
* 将attractions对象转为Json
*/
// 创建Gson对象
Gson gson = new Gson();
// 转换
String s = gson.toJson(attractions);
System.out.println(s);
}
static class Attractions {
private String name;
private String location;
private double price;
public Attractions() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Attractions{" +
"name='" + name + '\'' +
", location='" + location + '\'' +
", price=" + price +
'}';
}
}
}
如上,可生成一段JSON字符串
这个就当作我们获取到的JSON字符串了。
1.用Gson解析JSON
/**
* 解析Json
*/
// 创建Gson对象
Gson gson1 = new Gson();
// 解析
Attractions attractions1 = gson1.fromJson("{\"name\":\"东方明珠塔\",\"location\":\"浦东新区陆家嘴\",\"price\":99.9}", Attractions.class);
System.out.println(attractions1.getName());
通过创建Gson对象,调用Gson对象的formJson()方法可以将之前的字符串解析成一个Attractions对象(或别的类型),对象中所包含的属性自然也就可以取出来了。
2.用fastjson解析JSON
/**
* 解析Json
*/
Attractions attractions1 = JSON.parseObject("{\"name\":\"东方明珠塔\",\"location\":\"浦东新区陆家嘴\",\"price\":99.9}", Attractions.class);
System.out.println(attractions1.getName());
fastjson相较于Gson而言,可以不用创建对象,直接调用方法即可;
通过调用JSON的parseObject()方法,可以将JSON字符串解析成指定类型的对象。
当然,用它来创建一个JSON字符串也是很简单的,如:
/**
* 将attractions对象转为Json
*/
String s = JSON.toJSONString(attractions);
System.out.println(s);
解析网络上传来的JSON数据
上面两种方式解析的都是已有的字符串,下面就给出个网络上的JSON数据的解析例子以供参考。
package exerciseOfXmlAndJson;
import com.alibaba.fastjson.JSON;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Hashtable;
public class Demo7 {
public static void main(String[] args) throws IOException {
String phone = "18354377892";
URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=json&key=###");
// 创建URL连接
URLConnection uc = url.openConnection();
// 创建输入流
InputStream is = uc.getInputStream();
// 解析并取出数据
StringBuffer sb = new StringBuffer();
String str = null;
try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
// 将每行字符串添加到sb中
while ((str = br.readLine()) != null) {
sb.append(str);
}
str = sb.toString();
}
// 将获取到的数据解析为Hashtable类型的对象
Hashtable hashtable = JSON.parseObject(str, Hashtable.class);
Hashtable result = JSON.parseObject(hashtable.get("result").toString(), Hashtable.class);
if (!"200".equals(hashtable.get("resultcode"))) {
System.out.println("查询失败");
return;
}
if (result.get("province").equals(result.get("city"))) {
System.out.println("归属地:" + result.get("city") + "\n运营商:" + result.get("company"));
}else {
System.out.println("归属地:" + result.get("province") + " " + result.get("city") + "\n运营商:" + result.get("company"));
}
is.close();
}
}
这样就可以实现一个手机号码归属地和运营商查询的小东西。
PS:可以自己找一个提供手机号码归属地查询api的平台申请使用。