本文目錄一覽:
- 1、程序開發中json 存儲結構化數據是怎麼回事呢?
- 2、什麼叫JSON序列化啊?在.net下面學習json,我不懂什麼叫序列化?有什麼作用?
- 3、java解析json格式文件,再保存在資料庫怎麼做?
- 4、jackson中objectMapper的使用
- 5、c#讀取json
程序開發中json 存儲結構化數據是怎麼回事呢?
使用 json 存儲結構化數據就是從文件中讀寫字元串很容易。
1.數值就要多費點兒周折,因為 read() 方法只會返回字元串,應將其傳入 int() 這樣的函數,就可以將 ‘123’ 這樣的字元串轉換為對應的數值 123。當你想要保存更為複雜的數據類型,例如嵌套的列表和字典,手工解析和序列化它們將變得更複雜。
好在用戶不是非得自己編寫和調試保存複雜數據類型的代碼,Python 允許你使用常用的數據交換格式 JSON(JavaScript Object Notation)。標準模塊 json 可以接受 Python 數據結構,並將它們轉換為字元串表示形式;此過程稱為 序列化。從字元串表示形式重新構建數據結構稱為 反序列化。序列化和反序列化的過程中,表示該對象的字元串可以存儲在文件或數據中,也可以通過網路連接傳送給遠程的機器。
Note
2.JSON 格式經常用於現代應用程序中進行數據交換。許多程序員都已經熟悉它了,使它成為相互協作的一個不錯的選擇。
如果你有一個對象 x,你可以用簡單的一行代碼查看其 JSON 字元串表示形式:
json.dumps([1, ‘simple’, ‘list’])
‘[1, “simple”, “list”]’
dumps() 函數的另外一個變體 dump(),直接將對象序列化到一個文件。所以如果 f 是為寫入而打開的一個 文件對象,我們可以這樣做:
json.dump(x, f)
為了重新解碼對象,如果 f 是為讀取而打開的 文件對象:
x = json.load(f)
3.這種簡單的序列化技術可以處理列表和字典,但序列化任意類實例為 JSON 需要一點額外的努力。 json 模塊的手冊對此有詳細的解釋。
See also
pickle – pickle 模塊
4.與 JSON 不同,pickle 是一個協議,它允許任意複雜的 Python 對象的序列化。因此,它只能用於 Python 而不能用來與其他語言編寫的應用程序進行通信。默認情況下它也是不安全的:如果數據由熟練的攻擊者精心設計, 反序列化來自一個不受信任源的 pickle 數據可以執行任意代碼。
什麼叫JSON序列化啊?在.net下面學習json,我不懂什麼叫序列化?有什麼作用?
序列化 序列化 (serialization)
將對象的狀態信息轉換為可以存儲或傳輸的窗體的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以後,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
序列化使其他代碼可以查看或修改那些不序列化便無法訪問的對象實例數據。確切地說,代碼執行序列化需要特殊的許可權:即指定了 SerializationFormatter 標誌的 SecurityPermission。在默認策略下,通過 Internet 下載的代碼或 Intranet 代碼不會授予該許可權;只有本地計算機上的代碼才被授予該許可權。
通常,對象實例的所有欄位都會被序列化,這意味著數據會被表示為實例的序列化數據。這樣,能夠解釋該格式的代碼有可能能夠確定這些數據的值,而不依賴於該成員的可訪問性。類似地,反序列化從序列化的表示形式中提取數據,並直接設置對象狀態,這也與可訪問性規則無關。
對於任何可能包含重要的安全性數據的對象,如果可能,應該使該對象不可序列化。如果它必須為可序列化的,請嘗試生成特定欄位來保存不可序列化的重要數據。如果無法實現這一點,則應注意該數據會被公開給任何擁有序列化許可權的代碼,並確保不讓任何惡意代碼獲得該許可權。
序列化
序列化是將對象狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕鬆地存儲和傳輸數據。
序列化的目的:
1、以某種存儲形式使自定義對象持久化;
2、將對象從一個地方傳遞到另一個地方。
.NET Framework 提供兩種序列化技術:
* 二進位序列化保持類型保真度,這對於在應用程序的不同調用之間保留對象的狀態很有用。例如,通過將對象序列化到剪貼板,可在不同的應用程序之間共享對象。您可以將對象序列化到流、磁碟、內存和網路等等。遠程處理使用序列化「通過值」在計算機或應用程序域之間傳遞對象。
* XML 序列化僅序列化公共屬性和欄位,且不保持類型保真度。當您要提供或使用數據而不限制使用該數據的應用程序時,這一點是很有用的。由於 XML 是一個開放式標準,因此,對於通過 Web 共享數據而言,這是一個很好的選擇。SOAP 同樣是一個開放式標準,這使它也成為一個頗具吸引力的選擇。
java解析json格式文件,再保存在資料庫怎麼做?
java解析json格式文件,再保存在資料庫的方法:
1:定義一個實體類
2:用json lib將json字元串轉為Java對象
3:用jdbc或hibernate將java對象存入資料庫
直接讀寫文件,再把讀出來的文件內容格式化成json,再用JDBC、Mybatis或者其他框架將json數據存入資料庫。
假設實體類是這樣的:
public class ElectSet {
public String xueqi;
public String xuenian;
public String startTime;
public String endTime;
public int menshu;
public String isReadDB;
//{“xueqi”:,”xuenian”:,”startTime”:,”endTime”:,”renshu”:,”isReadDB”:}
public String getXueqi() {
return xueqi;
}
public void setXueqi(String xueqi) {
this.xueqi = xueqi;
}
public String getXuenian() {
return xuenian;
}
public void setXuenian(String xuenian) {
this.xuenian = xuenian;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public int getMenshu() {
return menshu;
}
public void setMenshu(int menshu) {
this.menshu = menshu;
}
public String getIsReadDB() {
return isReadDB;
}
public void setIsReadDB(String isReadDB) {
this.isReadDB = isReadDB;
}
}
有一個json格式的文件,存的信息如下:
Sets.json:
{“xuenian”:”2007-2008″,”xueqi”:”1″,”startTime”:”2009-07-19 08:30″,”endTime”:”2009-07-22 18:00″,”menshu”:”10″,”isReadDB”:”Y”}
具體操作:
/*
* 取出文件內容,填充對象
*/
public ElectSet findElectSet(String path){
ElectSet electset=new ElectSet();
String sets=ReadFile(path);//獲得json文件的內容
JSONObject jo=JSONObject.fromObject(sets);//格式化成json對象
//System.out.println(“————” jo);
//String name = jo.getString(“xuenian”);
//System.out.println(name);
electset.setXueqi(jo.getString(“xueqi”));
electset.setXuenian(jo.getString(“xuenian”));
electset.setStartTime(jo.getString(“startTime”));
electset.setEndTime(jo.getString(“endTime”));
electset.setMenshu(jo.getInt(“menshu”));
electset.setIsReadDB(jo.getString(“isReadDB”));
return electset;
}
//設置屬性,並保存
public boolean setElect(String path,String sets){
try {
writeFile(path,sets);
return true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
//讀文件,返回字元串
public String ReadFile(String path){
File file = new File(path);
BufferedReader reader = null;
String laststr = “”;
try {
//System.out.println(“以行為單位讀取文件內容,一次讀一整行:”);
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
//一次讀入一行,直到讀入null為文件結束
while ((tempString = reader.readLine()) != null) {
//顯示行號
System.out.println(“line ” line “: ” tempString);
laststr = laststr tempString;
line ;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
return laststr;
}
將獲取到的字元串,入庫即可。
jackson中objectMapper的使用
Jackson可以輕鬆的將Java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成Java對象
ObjectMapper類是Jackson庫的主要類。它稱為ObjectMapper的原因是因為它將JSON映射到Java對象(反序列化),或將Java對象映射到JSON(序列化)。它使用JsonParser和JsonGenerator的實例實現JSON實際的讀/寫。
三種方式
1.Jackson通過將JSON欄位的名稱與Java對象中的getter和setter方法相匹配,將JSON對象的欄位映射到Java對象中的欄位。Jackson刪除了getter和setter方法名稱的「get」和「set」部分,並將剩餘名稱的第一個字元轉換為小寫。
2.Jackson還可以通過java反射進行匹配
3.通過註解或者其它方式進行自定義的序列化和反序列化程序。
2.Read Object From JSON Reader
3.Read Object From JSON File
本例使用的是文件URL,也可使用一個HTTP URL(如: ).
6.Read Object From JSON Byte Array
7.Read Object Array From JSON Array String
ObjectMapper write有三個方法
使用Jackson可以讀取和寫入除JSON之外的其他數據格式:
其中這些數據格式比JSON更緊湊,因此在存儲時佔用的空間更少,並且讀取和寫入速度比JSON更快。在以下部分中,我將向您展示如何使用Jackson讀取和寫入其中一些數據格式。
CBOR是一種二進位數據格式,它與JSON兼容,但比JSON更緊湊,因此讀寫速度更快。Jackson ObjectMapper可以像讀寫JSON一樣讀寫CBOR。為了使用Jackson讀取和寫入CBOR,您需要為項目添加額外的Maven依賴項。介紹了添加Jackson CBOR Maven依賴關係:
MessagePack是一種文本數據格式,與JSON兼容,但更緊湊,因此讀寫速度更快。Jackson ObjectMapper可以像讀寫JSON一樣讀寫MessagePack。為了使用Jackson讀寫MessagePack,您需要為項目添加額外的Maven依賴項:
YAML是一種文本數據格式,類似於JSON,但使用不同的語法。Jackson ObjectMapper可以像讀寫JSON一樣讀寫YAML。為了使用Jackson讀取和寫入YAML,您需要為項目添加額外的Maven依賴項:
ObjectMapper 可以通過自定義解析器來定義解析方法
以下是自定義的反序列化的方法
註冊到objectMapper中
c#讀取json
先聲明,以下兩個方法我一直用
肯定沒有問題
TXT讀取方法
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.rT1.Text = “”;
FileStream fs1 = new FileStream(“2.txt”, FileMode.Open);
StreamReader sr = new StreamReader(fs1);
string str1 = sr.ReadToEnd();
this.rT1.Text = str1;
sr.Close();
fs1.Close();
}
}
}
———————————————————————————-
以下是 json的 序列化和反序列化
.net3.5提供了json對象序列化與反序列化的類。位置在:System.Runtime.Serialization.Json空間下。其中如果要應用這個空間還必須添加對
System.ServiceModel
System.ServiceModel.Web
這兩個庫文件的引用。
參考實體類:Customer
public class Customer
{
public int Unid { get; set; }
public string CustomerName { get; set; }
}
DataContractJsonSerializer
將對象序列化為 JavaScript 對象表示法 (JSON),並將 JSON 數據反序列化為對象。無法繼承此類。
其中有個方法WriteObject,它的功能定義為:將對象序列化為 JavaScript 對象表示法 (JSON) 文檔
它有三個方法重載,其中一個為:
public override void WriteObject(Stream stream,Object graph)
它的功能描述這:將指定對象序列化為 JavaScript 對象表示法 (JSON) 數據,並將生成的 JSON 寫入流中
(一)序列化
public string ToJson(Customer customer)
{
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(Customer));
MemoryStream ms=new MemoryStream();
ds.WriteObject(ms, customer);
string strReturn=Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return strReturn;
}
創建類實例,通過它的WriteObject方法來向流寫入序列化的對象,再把流寫入到字元串中。就可以得到JSON對象。
測試一下:
Customer cc = new Customer {Unid=1,CustomerName=”John” };
string strJson = ToJson(cc);
Console.WriteLine(strJson);
結果為:{“CustomerName”:”John”,”Unid”:1}
(二)反序列化
ReadObject方法,其描述為:反序列化 JSON(JavaScript 對象表示法)數據,並返回反序列化的對象。
它有很多重載,現在通過一種:
public override Object ReadObject(Stream stream)
它從流中得到反序列化的對象。
public object FromJson(string strJson)
{
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(Customer));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson));
return ds.ReadObject(ms);
}
測試:
string strJson=”{\”CustomerName\”:\”John\”,\”Unid\”:1}”;
Customer c=FromJson(strJson) as Customer;
Console.WriteLine(c.Unid+” “+c.CustomerName);
(三)通過泛型方法對兩者進行修改
為了適應多類型實例的序列化與反序列化,通過泛型方法來實現。
public string ToJsonT(T t)
{
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ds.WriteObject(ms, t);
string strReturn = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return strReturn;
}
public T FromJsonT(string strJson) where T:class
{
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson));
return ds.ReadObject(ms) as T;
}
•反序列化時通過泛型約束來指定類型T為類類型。
測試:
Customer cc = new Customer {Unid=1,CustomerName=”John” };
string strJsons = ToJsonCustomer(cc);
Console.WriteLine(strJsons);
string strJson=”{\”CustomerName\”:\”John\”,\”Unid\”:1}”;
Customer c = FromJsonCustomer(strJson);
Console.WriteLine(c.Unid+” “+c.CustomerName);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/199889.html