SpringBoot中, 我们有时需要将网页的数据接口的数据进行获取,然后将JSON数据转为对象,这里有我尝试过的方法,能够使用。
首先有一个网页接口有许多数据,类型为JSON,比如我所使用的这个数据地址,点击打开
大致结构如下
{"code":0,"data":[{"close":"596","createdDate":1406160000000,"high":"608.3","low":"596","marketFrom":0,"open":"605.9","type":3,"volume":"7.68"},{"close":"596.1","createdDate":1406246400000,"high":"603.98","low":"596","marketFrom":0,"open":"596","type":3,"volume":"35.282"}],"detailMsg":"","msg":""}
然后我们需要先导入所需的依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
接下来是最主要的方法,方法返回获取到的JSON数据,是一个JSONObject对象
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class GetJson {
public JSONObject getHttpJson(String url, int comefrom) {
try {
URL realUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
//请求成功
if (connection.getResponseCode() == 200) {
InputStream is = connection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//10MB的缓存
byte[] buffer = new byte[10485760];
int len = 0;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String jsonString = baos.toString();
baos.close();
is.close();
//转换成json数据处理
// getHttpJson函数的后面的参数1,表示返回的是json数据,2表示http接口的数据在一个()中的数据
JSONObject jsonArray = getJsonString(jsonString, comefrom);
return jsonArray;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
public JSONObject getJsonString(String str, int comefrom){
JSONObject jo = null;
if(comefrom==1){
return new JSONObject(str);
}else if(comefrom==2){
int indexStart = 0;
//字符处理
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='('){
indexStart = i;
break;
}
}
String strNew = "";
//分割字符串
for(int i=indexStart+1;i<str.length()-1;i++){
strNew += str.charAt(i);
}
return new JSONObject(strNew);
}
return jo;
}
}
得到了JSONObject对象以后,如何转为对象呢?我们先创建一个实体类,属性与获取的JSON属性一致
public class BtcoinEntity {
private Long id;
//开
private String open;
//收
private String close;
//时间
private Date createdDate;
//高
private String high;
//低
private String low;
//量
private String volume;
private String marketFrom;
private String type;
//省略getter和setter
}
然后导入将JSON转为对象的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
最后就是调用了
//访问获得json数据
JSONObject dayLine = new GetJson().getHttpJson(address,1);
// System.out.println(dayLine);
//取得data的json数据
JSONArray json=dayLine.getJSONArray("data");
//将json数据转化为对象列表
List<BtcoinEntity> list= JSON.parseArray(json.toString(),BtcoinEntity.class);
由于我们的对象数据只在data中,所以取出data所携带的数据,然后就是关键代码了JSON.parseArray(json.toString(),BtcoinEntity.class);
这样就将JSON数据转化为对象列表了,注意属性名要一致,否则会报错!
到这里就大功告成,如果还需要做持久化等处理就看自己的需求了。