關(guān)于Java跨域Json字符轉(zhuǎn)類對(duì)象的方法示例
前言
JSON是JavaScript Object Notation的縮寫,是一種輕量級(jí)的數(shù)據(jù)交換形式,是一種XML的替代方案,而且比XML更小,更快而且更易于解析。因?yàn)镴SON描述對(duì)象的時(shí)候使用的是JavaScript語(yǔ)法,它是語(yǔ)言和平臺(tái)獨(dú)立的,并且這些年許多JSON的解析器和類庫(kù)被開(kāi)發(fā)出來(lái)。
JSON具有以下這些形式:
對(duì)象是一個(gè)無(wú)序的“‘名稱/值'對(duì)”集合。一個(gè)對(duì)象以“{”(左括號(hào))開(kāi)始,“}”(右括號(hào))結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號(hào));“‘名稱/值' 對(duì)”之間使用“,”(逗號(hào))分隔。
值的有序列表(An ordered list of values)。在大部分語(yǔ)言中,它被實(shí)現(xiàn)為數(shù)組(array),矢量(vector),列表(list),序列(sequence)。
這些都是常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)。目前,絕大部分編程語(yǔ)言都以某種形式支持它們。這使得在各種編程語(yǔ)言之間交換同樣格式的數(shù)據(jù)成為可能。
對(duì)于從其他服務(wù)器的url獲得數(shù)據(jù),我們一般都為json數(shù)據(jù)傳輸,比如服務(wù)器B要從服務(wù)器A的url獲得分頁(yè)信息,得到j(luò)son字符后如果可以方便快捷操作要轉(zhuǎn)為自己的java對(duì)象。
在此我試過(guò)三種轉(zhuǎn)json的第三方,一種google的gson,這種好像無(wú)法轉(zhuǎn)成功,一直報(bào)json格式錯(cuò)誤,但校驗(yàn)一直通過(guò)正確,嘗試失敗。第二種是net.sf.json的,這種就是無(wú)報(bào)錯(cuò),但是對(duì)象的值一直為空。只有json-simple可以成功轉(zhuǎn)對(duì)象
解析json
首先,我們要解析json,查看json是否為標(biāo)準(zhǔn)的json格式,我們可以在網(wǎng)上的很多在線格式化查看json,解析json為對(duì)象一般都換湯不換藥。
第一:就是要知道json結(jié)構(gòu),這里我先開(kāi)啟服務(wù)器A從他的url得到一串json數(shù)據(jù)。

把復(fù)制json數(shù)據(jù)把它扔在格式化工具可以很清楚的看出結(jié)構(gòu):
{
"eventList": [
{
"id": 1030,
"eventId": "1508779115818499700",
"createTime": 1508779115000,
"endTime": 1508865480000,
"eventContent": "123",
"openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
},
{
"id": 1029,
"eventId": "1508382907251660498",
"createTime": 1508382906000,
"endTime": 1508383020000,
"eventContent": "ahhhhh",
"openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
},
{
"id": 1028,
"eventId": "1508308708414580378",
"createTime": 1508308721000,
"endTime": 1508309040000,
"eventContent": "30",
"openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
},
{
"id": 1027,
"eventId": "1508308463330664814",
"createTime": 1508308480000,
"endTime": 1508308560000,
"eventContent": "28",
"openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
},
{
"id": 1026,
"eventId": "1508308463017144213",
"createTime": 1508308479000,
"endTime": 1508308560000,
"eventContent": "27",
"openid": "o4eWZ06xzHW6mc2gMZMYVDEtx1zk"
}
],
"page": "1",
"size": "5",
"isHasPage": "1"
}
第二:根據(jù)結(jié)構(gòu)創(chuàng)建對(duì)應(yīng)的實(shí)體類
import com.yhn.consumer.entity.Event;
import lombok.Data;
import org.json.simple.JSONObject;
import java.io.Serializable;
import java.util.List;
@Data
public class EventVO implements Serializable{
private List<Event> eventList;
private String page;
private String size;
private String isHasPage;
public EventVO(JSONObject object){ //構(gòu)造器方法給對(duì)象賦值
eventList = (List<Event>)object.get("eventList");
page = (String)object.get("page");
size = (String)object.get("size");
isHasPage = (String)object.get("isHasPage");
}
}
因?yàn)槭莾?nèi)嵌結(jié)構(gòu),下面這個(gè)是private List<Event> eventList中的Event類;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;
@Entity
@Data
@DynamicUpdate //自動(dòng)更新時(shí)間字段
public class Event implements Serializable { //這是EventVO里L(fēng)ist中的Event
@Id
@GeneratedValue
private Integer id; //排序作用
private String eventId; //事件id
private Date createTime; //創(chuàng)建時(shí)間
private Date endTime; //更新時(shí)間
private String eventContent; //提醒事件內(nèi)容
private String openid; //用戶id
}
測(cè)試類
接下來(lái)結(jié)構(gòu)也寫好了,將在服務(wù)器B寫單元測(cè)試看看是否能夠成功賦值
@Test
public void clientDemo()throws Exception {
StringBuilder json = new StringBuilder();
URL urlObject = new URL("http://127.0.0.1/meetingSign/test/server?openid=o4eWZ06xzHW6mc2gMZMYVDEtx1zk&page=2&size=5"); //指定URL
HttpURLConnection uc = (HttpURLConnection) urlObject
.openConnection(); //開(kāi)啟連接
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "utf-8"));
String inputLine = null;
while ((inputLine = in.readLine()) != null) {
json.append(inputLine); //拼接json
}
in.close();
uc.disconnect();
System.out.println(json); //查看是否拿到。
//去除可能含編碼UTF-8等,因?yàn)榭赡芎蠦om頭文件。
String result = formatString(json.toString());
JSONParser parser=new JSONParser();
org.json.simple.JSONObject data = new org.json.simple.JSONObject();
data = (org.json.simple.JSONObject) parser.parse(result);
EventVO eventVO = new EventVO(data); //把值傳進(jìn)去
log.info("eventVO={}",eventVO);
}
/**
* 去除bom報(bào)頭
*/
public static String formatString(String s) {
if (s != null) {
s = s.replaceAll("\ufeff", "");
}
return s;
}
測(cè)試結(jié)果
是成給對(duì)象賦值了

總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java實(shí)現(xiàn)二叉樹(shù)的示例代碼(遞歸&迭代)
二叉樹(shù)(Binary?tree)是樹(shù)形結(jié)構(gòu)的一個(gè)重要類型。本文將利用Java語(yǔ)言實(shí)現(xiàn)二叉樹(shù),文中的示例代碼講解詳細(xì),需要的同學(xué)可以參考一下2022-03-03
Spring數(shù)據(jù)庫(kù)多數(shù)據(jù)源路由配置過(guò)程圖解
這篇文章主要介紹了Spring數(shù)據(jù)庫(kù)多數(shù)據(jù)源路由配置過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
IDEA 打開(kāi)java文件對(duì)應(yīng)的class路徑的操作步驟
這篇文章主要介紹了IDEA 打開(kāi)java文件對(duì)應(yīng)的class路徑的操作步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
BMIDE環(huán)境導(dǎo)入項(xiàng)目報(bào)編碼錯(cuò)誤解決方案
這篇文章主要介紹了BMIDE環(huán)境導(dǎo)入項(xiàng)目報(bào)編碼錯(cuò)誤解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
SpringMVC使用@Valid注解實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的代碼示例
在 Web 開(kāi)發(fā)中,數(shù)據(jù)驗(yàn)證是一個(gè)非常重要的環(huán)節(jié),它可以確保數(shù)據(jù)的合法性和正確性,保護(hù)系統(tǒng)不受到惡意攻擊或用戶誤操作的影響,在 SpringMVC 中,我們可以使用 @Valid 注解來(lái)實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證,所以本文就給大家介紹具體的使用方法,需要的朋友可以參考下2023-07-07
Spring Web零xml配置原理以及父子容器關(guān)系詳解
這篇文章主要介紹了Spring Web零xml配置原理以及父子容器關(guān)系詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
java面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)與依賴倒置原則詳解
這篇文章主要介紹了java面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)與依賴倒置原則的分析詳解,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10

