資料基礎---josn格式資料相關操作
1、java中josn格式資料相關操作
1.1、什麼是JSON?
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的資料交換語言。
fastJson
Fastjson是國內著名的電子商務網際網路公司阿里巴巴內部開發的用於java後臺處理json格式資料的一個工具包,包括“序列化”和“反序列化”兩部分,它具備如下特徵:
- 速度最快,測試表明,fastjson具有極快的效能,超越任其他的java json parser。包括自稱最快的jackson。
- 功能強大,完全支援java bean、集合、Map、日期、Enum,支援範型,支援自省。
- 無依賴,能夠直接執行在Java SE 5.0以上版本
- 支援Android。
- 開源 (Apache 2.0)
1.2、下載地址
1.3、fastjson主要API
- JSONObject
json物件,就是一個鍵對應一個值,使用的是大括號{ },如:{key:value} - JSONArray
json陣列,使用中括號[ ],只不過數組裡面的項也是json鍵值對格式的
/**
* Created by wanggs on 2017/7/27.
*/
public class JsonTest {
public static void main(String[] args) {
// Json物件中是新增的鍵值對,JSONArray中新增的是Json物件
JSONObject jsonObject = new JSONObject();
JSONObject jsonObject1 = new JSONObject();
JSONArray jsonArray = new JSONArray();
jsonObject1.put("001","tom");
// JSONObject 物件中新增鍵值對
jsonObject.put("key","value");
// 將JSONObject物件新增到json陣列中
jsonArray.add(jsonObject);
jsonArray.add(jsonObject1);
System.out.println(jsonArray.toString());
// 輸出結果: [{"key":"value"},{"001":"tom"}]
}
}
1.3.1、fastjson主要API說明
fastjson入口類是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString,和parseObject。常用的序列化操作都可以在JSON類上的靜態方法直接完成。
Fastjson API入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態方法直接完成。
public static final Object parse(String text); // 把JSON文字parse為JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文字parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文字parse為JavaBean
public static final JSONArray parseArray(String text); // 把JSON文字parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文字parse成JavaBean集合
public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文字
public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文字
public static final Object toJSON(Object javaObject); 將JavaBean轉換為JSONObject或者JSONArray。
上面的方法可以分為兩類:序列化和反序列化
序列化:如
String jsonString = JSON.toJSONString(obj);
反序列化:如
VO vo = JSON.parseObject("...", VO.class);
泛型反序列化:如
import com.alibaba.fastjson.TypeReference;
List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {})
1.3.2、fastjson主要API應用舉例
package josnTest.fastJosnTest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class FastJsonTest
{
/**
* 序列化
*/
public void toJsonString()
{
User user = new User("testFastJson001", "maks", 105);
String text = JSON.toJSONString(user); //User物件user序列化為josn文字,而user是一個可序列化物件
System.out.println("toJsonString()方法:text=" + text);
// 輸出結果:text={"age":105,"id":"testFastJson001","name":"maks"}
}
/**
* 反序列化為json物件
*/
public void parseJsonObject()
{
String text = "{\"age\":105,\"id\":\"testFastJson001\",\"name\":\"maks\"}"; //這個就是一個文字格式josn物件
JSONObject json = JSON.parseObject(text); //可以把text看成外界看的懂的資料,而JSONObject是java內看得懂的資料
System.out.println("parseJsonObject()方法:json==" + json);
// 輸出結果:json=={"age":105,"id":"testFastJson001","name":"maks"}
}
/**
* 反序列化為javaBean物件
*/
public void parseBeanObject()
{
String text = "{\"age\":105,\"id\":\"testFastJson001\",\"name\":\"maks\"}";
User user = (User) JSON.parseObject(text, User.class); //反序列化成特定格式的java物件,因為User是我們自定義的
System.out.println("parseBeanObject()方法:user==" + user.getId() + "," + user.getName() + "," + user.getAge());
// 輸出結果:user==testFastJson001,maks,105
}
/**
* 將javaBean轉化為json物件
*/
public void bean2Json()
{
User user = new User("testFastJson001", "maks", 105);
JSONObject jsonObj = (JSONObject) JSON.toJSON(user);
System.out.println("bean2Json()方法:jsonObj==" + jsonObj);
// 輸出結果:jsonObj=={"age":105,"id":"testFastJson001","name":"maks"}
}
/**
* 全序列化 直接把java bean序列化為json文字之後,能夠按照原來的型別反序列化回來。支援全序列化,需要開啟SerializerFeature.WriteClassName特性
*/
public void parseJSONAndBeanEachother()
{
User user = new User("testFastJson001", "maks", 105);
SerializerFeature[] featureArr = { SerializerFeature.WriteClassName };
String text = JSON.toJSONString(user, featureArr);
System.out.println("parseJSONAndBeanEachother()方法:text==" + text);
// 輸出結果:text=={"@type":"fastJson.test.User","age":105,"id":"testFastJson001","name":"maks"}
User userObj = (User) JSON.parse(text);
System.out.println("parseJSONAndBeanEachother()方法:userObj==" + userObj.getId() + "," + userObj.getName() + "," + userObj.getAge());
// 輸出結果:userObj==testFastJson001,maks,105
}
public static void main( String[] args )
{
FastJsonTest test = new FastJsonTest();
// 序列化
test.toJsonString();
// 反序列化為json物件
test.parseJsonObject();
// 反序列化為javaBean物件
test.parseBeanObject();
// 將javaBean轉化為json物件
test.bean2Json();
// 全序列化
test.parseJSONAndBeanEachother();
}
}
自定義User類如下
package josnTest.fastJosnTest;
import java.io.Serializable;
public class User implements Serializable{//可序列化宣告,但到底能不能序列化,最終還要看User類的成員變數能否序列化
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
public User() {
super();
}
public User(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
輸出結果如下
toJsonString()方法:text={"age":105,"id":"testFastJson001","name":"maks"}
parseJsonObject()方法:json=={"name":"maks","id":"testFastJson001","age":105}
parseBeanObject()方法:user==testFastJson001,maks,105
bean2Json()方法:jsonObj=={"name":"maks","id":"testFastJson001","age":105}
parseJSONAndBeanEachother()方法:text=={"@type":"josnTest.fastJosnTest.User","age":105,"id":"testFastJson001","name":"maks"}
parseJSONAndBeanEachother()方法:userObj==testFastJson001,maks,105
JSON.parseObject(String str)與JSONObject.parseObject(String str)的區別
根據原始碼顯示:JSON是一個抽象類,JSON中有一個靜態方法parseObject(String text),將text解析為一個JSONObject物件並返回;JSONObject是一個繼承自JSON的類,當呼叫JSONObject.parseObject(result)時,會直接呼叫父類的parseObject(String text)。所以兩者沒什麼區別,一個是用父類去呼叫父類自己的靜態的parseObject(String text),一個是用子類去呼叫父類的靜態parseObject(String text),兩者調的是同一個方法。
關於fastjson更詳細的使用方法可參考JSON最佳實踐
1.4、fastjson如何處理日期
fastjson處理日期的API很簡單,例如:
JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")
使用ISO-8601日期格式
JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);
全域性修改日期格式
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
反序列化能夠自動識別如下日期格式:
ISO-8601日期格式
yyyy-MM-dd
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd HH:mm:ss.SSS
毫秒數字
毫秒數字字串
.NET JSON日期格式
new Date(198293238)
1.5、fastjson 如何處理超大物件和超大JSON文字
1.6、將資料庫中的資料轉換成json格式
需要兩個jar包,一個連線接資料庫(mysql-connector-java-version.jar
如mysql-connector-java-8.0.11.jar
),一個關於json(fastjson-1.2.44.jar
)
package josnTest.fastJosnTest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
public class mysqlToJosn {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
//這裡我的資料庫名字是Person,改成你自己的資料庫名
String url = "jdbc:mysql://111.22.33.444:3306/xxx";
String user = "xxxx";
String pwd = "xxxx";
try {
Class.forName(driver);
Connection con = DriverManager.getConnection(url,user,pwd);
Statement stet = con.createStatement();
//我的資料庫Person中的表student,改成你自己的表
String sql = "select * from xxxx limit 5;";
ResultSet rs = stet.executeQuery(sql);
ResultSetMetaData metaData = rs.getMetaData();
int columnCount= metaData.getColumnCount();
JSONArray jsonObjArray = new JSONArray();
while(rs.next()){
JSONObject jsonObj = new JSONObject();
for(int i = 1; i <= columnCount;i++)
{
String columnName = metaData.getColumnLabel(i);
String value =rs.getString(columnName);
jsonObj.put(columnName, value);//每一條記錄存放於一個JSONObject物件中
}
jsonObjArray.add(jsonObj); //所有物件存放於JSONArray物件中
}
JSONObject jsonObjTal = new JSONObject();
jsonObjTal.put("retBody", jsonObjArray);//最後再封裝一層,一般還會有與retBody平級的其他鍵值對,比如狀態資訊
System.out.println("轉換JSON資料:");
System.out.println(jsonObjTal.toString());
con.close();
} catch (Exception e) {
e.printStackTrace();// TODO: handle exception
}
}
}
返回結果大致如下:
轉換JSON資料:
{"retBody":[{"date":"20180327","fullcode":"W22770022","fluxpred":"0.00"},{"date":"20180328","fullcode":"W22770022","fluxpred":"0.00"},{"date":"20180329","fullcode":"W22770022","fluxpred":"0.00"},{"date":"20180330","fullcode":"W22770022","fluxpred":"0.00"},{"date":"20180331","fullcode":"W22770022","fluxpred":"0.00"}]}
2、python中josn格式資料相關操作
函式 | 描述 |
---|---|
json.dumps | 將 Python 物件編碼成 JSON 字串 |
json.loads | 將已編碼的 JSON 字串解碼為 Python 物件 |
2.1、json.dumps
json.dumps 用於將 Python 物件編碼成 JSON 字串。
語法
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
例項
以下例項將陣列編碼為 JSON 格式資料:
#!/usr/bin/python
import json
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
jsonData=json.dumps(data)
print(jsonData)
以上程式碼執行結果為:
[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
使用引數讓 JSON 資料格式化輸出:
import json
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
jsonData=json.dumps(data,sort_keys=True,indent=4,separators=(',',':'))
print(jsonData)
[
{
"a":1,
"b":2,
"c":3,
"d":4,
"e":5
}
]
python 原始型別向 json 型別的轉化對照表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
2.2、json.loads
json.loads 用於解碼 JSON 資料。該函式返回 Python 欄位的資料型別。
語法
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
例項
以下例項展示了Python 如何解碼 JSON 物件:
import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
text = json.loads(jsonData)
print(text)
以上程式碼執行結果為:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
json 型別轉換到 python 的型別對照表:
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
>>> import json
>>> test="{'data':'123'}"
>>> result=json.loads(test)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "d:\Anaconda3\lib\json\__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "d:\Anaconda3\lib\json\decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "d:\Anaconda3\lib\json\decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes:
line 1 column 2 (char 1)
原因在於:字串裡用單引號來標識字元(python裡自動的)。
解決辦法如下:將字串裡的單引號替換成雙引號
1 >>> import re
2 >>> test=re.sub('\'','\"',test)
3 >>> result=json.loads(test)
4 >>> result['data']
5 '123'
對於帶u’的字串,u也要去掉:
>>> c=f.read()
>>> c
"{u'meta': {u'code': 200, u'requestId': u'5815f6739fb6b77494061e19'}, u'response
': {u'tips': {u'count': 0, u'items': []}}}"
>>> d=re.sub("u'","\"",c)
>>> d
'{"meta\': {"code\': 200, "requestId\': "5815f6739fb6b77494061e19\'}, "response\
': {"tips\': {"count\': 0, "items\': []}}}'
>>> d=re.sub("'","\"",d)
>>> d
'{"meta": {"code": 200, "requestId": "5815f6739fb6b77494061e19"}, "response": {"
tips": {"count": 0, "items": []}}}'
>>> json.loads(d)
{'response': {'tips': {'items': [], 'count': 0}}, 'meta': {'requestId': '5815f67
39fb6b77494061e19', 'code': 200}}
2.2.1、抓取請求,並解析json內容
這裡採用的是python 的 requests 庫進行抓取。
2.3、使用第三方庫:Demjson
Demjson 是 python 的第三方模組庫,可用於編碼和解碼 JSON 資料,包含了 JSONLint 的格式化及校驗功能。
在使用 Demjson 編碼或解碼 JSON 資料前,我們需要先安裝 Demjson 模組。本教程我們會下載 Demjson 並安裝:
$ tar -xvzf demjson-2.2.3.tar.gz
$ cd demjson-2.2.3
$ python setup.py install
JSON 函式
函式 | 描述 |
---|---|
encode | 將 Python 物件編碼成 JSON 字串 |
decode | 將已編碼的 JSON 字串解碼為 Python 物件 |
encode
Python encode() 函式用於將 Python 物件編碼成 JSON 字串。
語法
demjson.encode(self, obj, nest_level=0)
例項
以下例項將陣列編碼為 JSON 格式資料:
未完
相關推薦
資料基礎---josn格式資料相關操作
1、java中josn格式資料相關操作 主要是對Fastjson進行學習 來源1 來源2 1.1、什麼是JSON? JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。 易於人閱讀和編寫。同時也易於機器解析
Python資料加密,解密的相關操作(hashlib、hmac、random、base64、pycrypto)
本文內容 資料加密概述 Python中實現資料加密的模組簡介 hashlib與hmac模組介紹 random與secrets模組介紹 base64模組介紹 pycrypto模組介紹 總結 參考文件 提示: Python 2.7中
PHP_Day02_資料型別_陣列及其相關操作
<?php /* 在PHP新版本中陣列通過方括號來定義,在元素是多行的情況下,每行後面都要跟上逗號 陣列元素通過鍵值對來儲存,如:key1 => val1, key2 => val2, 當鍵名為整型的時候稱為索引陣列,當鍵名為字元型的時候稱為關
線性表資料結構型別定義及相關操作總結
1、順序儲存結構(如陣列) 定義: #define MAXSIZE 20 typedef struct{ int data[MAXSIZE]; //假設這裡是整型 int length; //線性表長度 }; 讀取其中某個元素:假設線性順序表已存在,讀取其中第i個元素
python3基礎(九)-系統檔案相關操作
1、import os os.rename("test1.txt" , "test2.txt") #修改檔名稱 os.path.abspath("test2.txt") #獲取檔案絕對路徑 os.path.getsize("test2.txt") #獲取檔案大小
解決Java中POI匯入Excel表格資料時 日期格式資料解析錯誤的問題
用POI匯入excel資料時,日期格式(如2018/7/7)資料預設會被解析成double格式,解決方法如下: package com.test.util; import java.text.DateFormat; import java.text.SimpleDate
Robotframework實現Dictionary資料和Json格式資料自由轉換
在Robotframework中進行介面協議測試時,需要實現Dictionary資料和Json格式資料自由轉換,便於資料構造方便快捷。本文章主要講解如何實現兩者之前的自由轉換。 一、首先Dictionary資料和Json格式資料自由轉換需要依賴python裡面的demjso
hive的資料組織格式和基本操作
hive的資料組織格式: 庫: 管理資料 不同模組的資料最好放在不同的資料庫中 &n
git操作基礎:刪除資料夾
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【資料結構】二叉樹的相關操作(待更)
#include "stdio.h" #include "stdlib.h" typedef struct node { char data; struct node *rchild,*lchild; }bintnode; typedef bintnode *bintree;//指向該結構體
資料基礎---《利用Python進行資料分析·第2版》第6章 資料載入、儲存與檔案格式
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 訪問資料是使用本書所介紹的這些工具的第一步。我會著重介紹pandas的資料輸入與輸出,雖然別的庫中也有不少以此為目的的工具
PACAL VOC資料集格式的相關問題
獲取指定畫素值的座標 image_path = 'C:\\Users\\Yeh Chih-En\\Desktop\\test_images\\0bb0672f1afd6baaf94c516bcfb7dfae.png' image = Image.open(i
資料結構作業:二叉排序樹及其相關操作
寫了一個簡單的。 因為自己對泛型瞭解的還是不夠到位,所以只能寫個demo版的。 這課樹沒辦法維持平衡,希望以後學一下紅黑樹,替罪羊樹etc. /* * 簡單的二叉查詢樹 * 沒有自帶旋轉平衡 * 寫完這個我學一下 * avl樹還有紅黑樹 */ public c
Java,前後端分離,從VUE傳到後臺的資料的相關操作
獲取: Map<String, Object> paramMap = (Map<String, Object>) request.getAttribute("data"); Map<String, Object> formMap = (Map<Strin
資料結構與演算法總結——二叉查詢樹及其相關操作
我實現瞭如下操作 插入,查詢,刪除,最大值 樹的高度,子樹大小 二叉樹的範圍和,範圍搜尋 樹的前序,中序,後序三種遍歷 rank 前驅值 在這一版本的程式碼中,我使用了類模板將介面與實現分
零基礎入門大資料之spark中的幾種key-value操作
今天記錄一下spark裡面的一些key-value對的相關運算元。 key-value對可以簡單理解為是一種認為構造的資料結構方式,比如一個字串"hello",單看"hello"的話,它是一個字串型別,現在假設我想把它在一個文字中出現的次數n作為一個值和"hello"一起操作,那麼可
mysql-資料(記錄)相關操作(增刪改查)及許可權管理
一、介紹 在MySQL管理軟體中,可以通過SQL語句中的DML語言來實現資料的操作,包括 使用INSERT實現資料的插入 UPDATE實現資料的更新 使用DELETE實現資料的刪除 使用SELECT查詢資料以及。 二、插入資料 1. 插入完整資料(順序插入) 語法一:
小白眼中的Python3.0中對資料型別List的相關操作
PS:本人小白,剛開始自學,先重在使用,再由淺入深,其中有現階段未領悟到的和筆誤,望前輩指出修正 :) 轉載也請註明出處哦~ 因為學完了Python中資料型別List的章節,所以對個別常用相關操作做個彙總,日後再慢慢增加,做個備忘 1. 建立List資料
halcon教程從0基礎到精通 快速瞭解操作並精通視覺專案最全視訊教程資料彙總 halcon下載
全網最全資料總連結: halcon是德國公司開發的一套很完善的機器視覺演算法包,很廣泛地應用於工業各個領域中,用途十分廣泛,是一款值得學習的影象處理軟體,個人覺得:halcon雖然沒有opencv和matlab在影象處理領域應用更加廣泛,專業性、整合封裝性、穩
大資料基礎hdfs啟動過程和相關元件解釋
問題導讀: 1.job的本質是什麼? 2.任務的本質是什麼? 3.檔案系統的Namespace由誰來管理,Namespace的作用是什麼? 4.Namespace 映象檔案(Namespace image)和操作日誌檔案(edit log)檔案的作用是什麼? 5