1. 程式人生 > >資料基礎---josn格式資料相關操作

資料基礎---josn格式資料相關操作

1、java中josn格式資料相關操作

主要是對Fastjson進行學習
來源1
來源2

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.jarmysql-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