- tags:java,json,javascript
- categories:筆記
- date: 2016-11-16 20:18:52
在日常的開發中,在前后端的數據傳輸與處理中,總會遇到java與json的數據轉換,javascript內json與string之間的轉換等。所以就想總結看看這三個之間是如何轉換的,可以有那些方式進行轉換呢?這3J的轉換也總會與string字符串類型有關,因為字符串在我們程序中簡直不能再常見了。o(≧v≦)o。。。所以咧,就打算用具體代碼實例來看看它們是如何進行數據處理的,下一次若是有這種類似的需求,就可以很快把代碼擼出來了,也是基本功的問題。
下面就根據目前我的學習知識,總結以下它們各自之間的關系和轉換過程。
Java與Json
其中最重要也最長使用的就是后臺的java與json數據的轉換,包括java pojo轉成json字符串,再通過response輸出到瀏覽器前端頁面進行渲染等其他處理,當然也有,從前端獲取json格式字符串,到后臺接收數據后,將字符串轉換成bean或者集合等等。所以,java與json轉化的工具庫也是挺多的,主要的包括以下幾種:Jackson,Fastjson,Google-Gson,Json-lib。。等等,具體的可以參考該篇文章Java 的 JSON 開源類庫選擇比較
下面就說說主要使用的幾種工具庫把。。在此之前,把幾個類庫需要用到的基礎數據準備好,包括一個user,book兩個bean。
public class User {
private int id;
private String userName;
private String password;
private int age;
private String phoneNumber;
private String address;
private List<Books> lbooks;
//getter setter
...
}
public class Books {
private String author;
private String price;
private String name;
//getter setter
...
}
構造的簡單基礎數據,這些數據都是被下面幾種庫所共用的:
public User user1;
public User user2;
public List<User> lusers = new ArrayList<User>();
public List<Books> lbooks = new ArrayList<Books>();
public Map<Integer,User> musers = new HashMap<Integer,User>();
@Before
public void init(){
initUsers();
lusers.add(user1);
lusers.add(user2);
musers.put(1, user1);
musers.put(2, user2);
}
public void initUsers(){
user1 = new User();
user1.setId(1);
user1.setUserName("heiOne");
user1.setPassword("aa");
user1.setPhoneNumber("1234");
user1.setAge(20);
user1.setAddress("CN.GZ");
user2 = new User();
user2.setId(2);
user2.setUserName("heiTwo");
user2.setPassword("bb");
user2.setPhoneNumber("56789");
user2.setAge(30);
user2.setAddress("CN.SH");
Books b1 = new Books();
b1.setAuthor("泰戈爾");
b1.setPrice("50.00");
b1.setName("飛鳥集");
Books b2 = new Books();
b2.setAuthor("司湯達");
b2.setPrice("40.00");
b2.setName("紅與黑");
Books b3 = new Books();
b3.setAuthor("塞林格");
b3.setPrice("30.00");
b3.setName("麥田里的守望者");
lbooks.add(b1);
lbooks.add(b2);
List<Books> cbooks = new ArrayList<Books>();
cbooks.addAll(lbooks);
user1.setLbooks(lbooks);
cbooks.add(b3);
user2.setLbooks(cbooks);
}
其中,User中包含Books的集合屬性,為了測試復合結構的數據集合。
-
Jackson:
Jackjson工具庫功能挺強大的,可以讀取文件流獲取字節碼來處理json字符串,也能對樹模型操作,提供了api總有關于節點的構建操作。當然了,也能處理與java對象的雙向轉換。這點其實可以從Jackson的maven庫配置的artifactId可以看到,提供對應的不同模塊功能的處理。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-base -->
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-base</artifactId>
<version>2.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider -->
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.0</version>
</dependency>
下面通過編寫的一個測試用例類JavaAndJsonWithJackson.java來看看具體的操作。對于功能性較強的Jackson,我們只是關注它的java與json之間轉換的部分,它的核心類就是ObjectMapper,有興趣學習更多內容的可以自行度娘。(不過話說連jackson官網都被xx了,汗...)
總的來說,若是java類型想要轉成json格式字符串,就用writeValueAsString
等格式方法;若是json字符串要轉成java類型對象,則使用readValue
方法。
Java POJO與Json之間的轉換:
對于java數據轉成json,大多都是writeValue*相關的方法。這種也是最簡單基礎的用法啦...
@Test
public void javaPojoPointToJsonStr() throws Exception{
ObjectMapper om = new ObjectMapper();
//java pojo轉換成json字符串
String ustr = om.writeValueAsString(user1);
System.out.println("java user pojo 轉換成json字符串:"+ ustr);
//json 字符串轉成java pojo
User jsonUser = om.readValue(ustr, User.class);
System.out.println("user json 字符串轉成User.class pojo"+jsonUser);
}
//輸出:可以在www.bejson.com在線格式化校驗json字符串
java user pojo 轉換成json字符串:
{
"id": 1,
"userName": "heiOne",
"password": "aa",
"age": 20,
"phoneNumber": "1234",
"address": "CN.GZ",
"lbooks": [
{
"author": "泰戈爾",
"price": "50.00",
"name": "飛鳥集"
},
{
"author": "司湯達",
"price": "40.00",
"name": "紅與黑"
}
]
}
user json 字符串轉成User.class pojo:(輸出格式是通過toString定義的)
User.class pojoUser
[id=1, userName=heiOne, password=aa, age=20, phoneNumber=1234, address=CN.GZ,
lbooks=[Books [author=泰戈爾, price=50.00, name=飛鳥集],
Books [author=司湯達, price=40.00, name=紅與黑]]]
Java List集合與Json之間的轉換:
其實也都差不多,只是當json字符串轉成java list集合時候,每個list內的數據類型是:LinkedHashMap,然后可以通過key,value形式取出每個數據。
@Test
public void javaListPointToJsonStr() throws Exception{
ObjectMapper om = new ObjectMapper();
//java list轉換成json字符串
String listStr = om.writeValueAsString(lusers);
System.out.println("java list集合轉換為json字符串:"+listStr);
//list形式json字符串轉換成java list. List<User>不可轉
List uList = om.readValue(listStr, List.class);
System.out.println("list json 轉換成java list集合:"+uList);
for(int i=0;i<uList.size();i++){
// System.out.println(uList.get(i).getClass()); //LinkedHashMap
LinkedHashMap lhm = (LinkedHashMap) uList.get(i);
System.out.println(lhm.get("userName"));
System.out.println(lhm.get("lbooks"));
}
}
//輸出:
[
{
"id": 1,
"userName": "heiOne",
"password": "aa",
"age": 20,
"phoneNumber": "1234",
"address": "CN.GZ",
"lbooks": [
{
"author": "泰戈爾",
"price": "50.00",
"name": "飛鳥集"
},
{
"author": "司湯達",
"price": "40.00",
"name": "紅與黑"
}
]
},
{
"id": 2,
"userName": "heiTwo",
"password": "bb",
"age": 30,
"phoneNumber": "56789",
"address": "CN.SH",
"lbooks": [
{
"author": "泰戈爾",
"price": "50.00",
"name": "飛鳥集"
},
{
"author": "司湯達",
"price": "40.00",
"name": "紅與黑"
},
{
"author": "塞林格",
"price": "30.00",
"name": "麥田里的守望者"
}
]
}
]
heiOne
[{author=泰戈爾, price=50.00, name=飛鳥集}, {author=司湯達, price=40.00, name=紅與黑}]
heiTwo
[{author=泰戈爾, price=50.00, name=飛鳥集}, {author=司湯達, price=40.00, name=紅與黑},
{author=塞林格, price=30.00, name=麥田里的守望者}]
Java Map集合與Json之間的轉換:
使用方法和輸出都與list集合差不多,就不在多說了。
@Test
public void javaMapPointToJsonStr()throws Exception{
ObjectMapper om = new ObjectMapper();
//java map ---> json
String mapStr = om.writeValueAsString(musers);
System.out.println("java map集合轉換為json字符串:"+mapStr);
//map json --> java map
Map umap = om.readValue(mapStr, Map.class);
System.out.println("map json 轉換為java map:"+umap);
// System.out.println(umap.get("1").getClass());
for(int i=1;i<=umap.size();i++){
LinkedHashMap lhm = (LinkedHashMap) umap.get(String.valueOf(i));
System.out.println(lhm.get("userName"));
System.out.println(lhm.get("lbooks"));
}
}
-
FastJson:
下面這個就是阿里的fastjson啦,感覺也挺強大和易用的,主要是通過com.alibaba.fastjson.JSON對象進行轉換。
若是java類型轉成json格式字符串,可以使用toJSONString
方法,反之,可以使用parseObject
或者parseArray
等方法。想了解更多,可以查看fastjson的github項目
這里的例子輸出可以參考jackson的test測試用例。這里多說一點,fastjson在輸出字符串的時候,若是數據相同則會出現$ref
引用符號出現,在測試的時候,發現若是將帶有這個引用符號的json字符串轉換成java類型對象會出現null值的現象。
maven庫配置:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.13</version>
</dependency>
Java POJO與Json之間的轉換:
@Test
public void javaPojoPointToJsonStr() throws Exception{
//java pojo轉換成json字符串
String ustr = JSON.toJSONString(user1);
System.out.println("java user pojo 轉換成json字符串:"+ ustr);
//
//json 字符串轉成java pojo
User jsonUser = JSON.parseObject(ustr,User.class);
System.out.println("user json 字符串轉成User.class pojo"+jsonUser);
}
Java List集合與Json之間的轉換:
@Test
public void javaListPointToJsonStr() throws Exception{
// java list轉換成json字符串
String listStr = JSON.toJSONString(lusers);
System.out.println("java list集合轉換為json字符串:"+listStr);
// list形式json字符串轉換成java list. JSON.parseObject
List uList = JSON.parseObject(listStr, List.class);
System.out.println("list json 轉換成java list集合:"+uList);
for(int i=0;i<uList.size();i++){
// System.out.println(uList.get(i).getClass());//JSONObject
JSONObject jo = (JSONObject) uList.get(i);
// System.out.println(jo.size());
System.out.println(jo.get("userName"));
System.out.println(jo.get("lbooks"));
}
//JSON.parseArray
List<User> uList1 = JSON.parseArray(listStr, User.class);
System.out.println(uList1);
for(User u : uList1){
System.out.println(u.getUserName());
}
}
Java Map集合與Json之間的轉換:
@Test
public void javaMapPointToJsonStr()throws Exception{
// //java map ---> json
String mapStr = JSON.toJSONString(musers);
System.out.println("java map集合轉換為json字符串:"+mapStr);
//
//map json --> java map
//http://blog.csdn.net/weixiaodedao/article/details/51790790 解決使用fastJson中出現$ref問題
JSONObject umap = JSON.parseObject(mapStr); //引用$ref,null
System.out.println("map json 轉換為java map:"+umap);
// System.out.println(umap.get("1").getClass());
for(int i=1;i<=umap.size();i++){
JSONObject obj = (JSONObject) umap.get(String.valueOf(i)); //com.alibaba.fastjson.JSONObject
System.out.println(obj.get("userName"));
}
}
-
JSON-lib:
若是要轉換成json格式字符串可以使用JSONObject.fromObject
或者JSONArray.fromObject
方法;若是要轉換成集合或者java bean則可以使用這些方法JSONArray.toList
(已廢棄)或者JSONArray.toArray
,至于map的轉換,可以要自己來抽取內部數據實現調整了。
maven庫配置:
<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
Java POJO與Json之間的轉換:
//http://ryxxlong.iteye.com/blog/583862 json-lib使用方法
@Test
public void javaPojoPointToJsonStr() throws Exception{
//java pojo轉換成json字符串,都是先轉換成JSONObject對象
JSONObject jsonObject = JSONObject.fromObject(user1);
String ustr = jsonObject.toString();
System.out.println("java user pojo 轉換成json字符串:"+ ustr);
// json 字符串轉成java pojo
User jsonUser = (User) JSONObject.toBean(jsonObject, User.class);
System.out.println("user json 字符串轉成User.class pojo"+jsonUser);
}
Java List集合與Json之間的轉換:
@Test
public void javaListAndArrayPointToJsonStr() throws Exception{
// java list轉換成json字符串
JSONArray jsonArray = JSONArray.fromObject(lusers);
String listStr = jsonArray.toString();
System.out.println("java list集合轉換為json字符串:"+listStr);
// list形式json字符串轉換成java list.
// List<User> uList = JSONArray.toList(jsonArray, User.class); //toList已被廢棄
User[] array = (User[]) JSONArray.toArray(jsonArray, User.class);
// System.out.println("list"+uList);
System.out.println("array:"+array);
//JSON.parseArray
// for(User u : uList){
// System.out.println(u.getUserName());
// }
for(int i=0;i<array.length;i++){
System.out.println(array[i].getUserName());
}
}
Java Map集合與Json之間的轉換:
若是想看看更細節的map與json轉換,可以參考這篇文章:<u>采用json-lib進行Map與Json轉換</u>
@Test
public void javaMapPointToJsonStr()throws Exception{
// //java map ---> json 這里map<key,value>中必須為string類型
Map<String,String> tmp = new HashMap<String,String>();
tmp.put("one", "apple");
tmp.put("two", "hehe");
JSONObject ja= JSONObject.fromObject(tmp);
System.out.println("java map集合轉換為json字符串:"+ja.toString());//{"two":"hehe","one":"apple"}
Map<String,Map<String,String>> mmtmp = new HashMap<String,Map<String,String>>();
Map<String,String> mtmp = new HashMap<String,String>();
mtmp.put("inner", "test");
mmtmp.put("a", mtmp);
mmtmp.put("b", mtmp);
JSONArray jsonArray= JSONArray.fromObject(mmtmp);
System.out.println("java map集合轉換為json字符串:"+jsonArray.toString());//[{"b":{"inner":"test"},"a":{"inner":"test"}}]
//
//更多使用JSON-LIB 對map與json轉換可以參考該片文章:https://my.oschina.net/heweipo/blog/386808
}
關于java與json數據的基本轉換常用工具使用方法就寫到這,當然這些都是基礎內容,在項目開發中,實則可以自己在封裝工具類對需求的業務進行處理。
Json與Javascript
除了java與json之間需要轉換,經常在開發web項目時候,從后端得到的json字符串在前端處理總會要轉換成json對象的需求,反之亦然。所以,來看看在前端頁面中的script腳本中是如何處理json數據的?
其實,javascript原生的就有對json數據轉換的方法。總的來說,在前端頁面的script腳本中:json字符串想轉換成json對象,可以使用
eval('(' + jsonstr + ')')
方法;json對象要轉換成string字符串則可以使用JSON.stringify(jsonObject)
方法。
下面看看后端輸出json字符串到前端后,前端如何處理json字符串的:
- 后端java代碼:使用jackson來將list集合轉換成json字符串輸出:
public List<User> lusers = new ArrayList<User>();
@RequestMapping(value="/jj.do",method=RequestMethod.GET)
public String toJJPage(HttpServletRequest request) throws Exception{
if(lusers.size()<1)
initData();
ObjectMapper om = new ObjectMapper();
//java list轉換成json字符串
String listStr = om.writeValueAsString(lusers);
System.out.println("java list集合轉換為json字符串:"+listStr);
request.setAttribute("lusers", listStr);
return "js_json";
}
-
在看使用springmvc將頁面跳轉到js_json.jsp中:
可以看到,將后端中的request域中的lusers
屬性輸出是一串json格式字符串,然后在script腳本中使用方法eval('('+str+')'),JSON.stringify方法將json字符串和json對象互相轉換。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
Object listUser = request.getAttribute("lusers");
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<title>Javascript-json</title>
</head>
<body>
List user: <%=listUser%>
<script type="text/javascript">
var luser = '<%=listUser%>';
alert(luser+':'+typeof(luser)); //string
//JSON字符串轉換為JSON對象
var json = eval('(' + luser + ')'); //可用
var json = JSON.parse(luser);
alert(json+':'+typeof(json));
alert(json[0].userName);
//將json對象轉換為json格式字符串
var userJson = JSON.stringify(json); //ok
alert('json object --> json string:'+userJson);
</script>
</body>
</html>
Java與Javascript
咳咳...這個就是最簡單了。通常需要將java對象轉換成javascript對象時候,一般就是在前端頁面中,例如jsp等。在<% %>
中可以定義或者java代碼對象,可以通過<%=variable %>
表達式可以獲取java對象。結合這些特性,那么要在script腳本中使用java對象,只需要用兩個'
單引號將java對象引起來即可賦值給javascript變量。
可以參照上面json與javascript轉換中的jsp頁面中就有使用:
<script type="text/javascript">
var luser = '<%=listUser%>'; //將java對象賦值給javascript變量
alert(luser+':'+typeof(luser)); //string
</script>
ok,總結得差不多了,日后有可以完善的在整合啦...( ̄▽ ̄)~*