JSON(JavaScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式,它採用完全獨立於程式語言的文字格式來儲存和表示資料,由於層次結構簡潔清晰、易於閱讀和編寫、易於機器解析和生成,能夠有效提升網路資料的傳輸效率。
JSON是一個標記符的序列,其中標記符包含六個構造字元(左大括號{ 、左中括號[ 、右中括號] 、右大括號}、冒號: 、逗號, ),任何支援的型別都可以通過 JSON 來表示,例如字串、數位、物件、陣列等,但物件和陣列是比較特殊且較為常用。
字串與C或者Java的字串非常相似。字串是由雙引號包圍的任意數量Unicode字元的集合,使用反斜線跳脫。一個字元(character)即一個單獨的字串(character string)。
數位也與C或者Java的數值非常相似。除去未曾使用的八進位制與十六進位制格式。除去一些編碼細節。
物件:物件在 JavaScript 中由花括號 {}括起來逗號分割的成員構成,資料結構為 {key1:value1, key2:value2, ...}
的鍵值對結構,在物件導向的語言中,key 為物件的屬性,value 為對應的值,其中鍵名可以使用整數和字串來表示,值的型別可以是任意型別。
陣列:陣列在 JavaScript 中是由方括號 [] 括起來的一組值構成,資料結構為["java", "javascript", "vb", ...]
的索引結構,值的型別也可以是任意型別。
用JSON表示中國部分省市如下:
{
"name": "中國",
"province": [{
"name": "黑龍江",
"cities": {
"city": ["哈爾濱", "大慶"]
}
}, {
"name": "廣東",
"cities": {
"city": ["廣州", "深圳", "珠海"]
}
}, {
"name": "臺灣",
"cities": {
"city": ["臺北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["烏魯木齊"]
}
}]
}
可延伸標示語言是標準通用標示語言的子集,簡稱XML,它是一種用於標記電子檔案使其具有結構性的標示語言。XML的簡單易於在任何應用程式中讀/寫資料,這使XML很快成為資料交換的唯一公共語言。XML具有以下特點:(1) XML可以從HTML中分離資料;(2) XML可用於交換資料;(3)利用XML可以共用資料;(4) XML可以充分利用資料;(5) XML可以用於建立新的語言。XML使用一個簡單而又靈活的標準格式,為基於Web的應用提供了一個描述資料和交換資料的有效手段。HTML著重描述如何將檔案顯示在瀏覽器中,而XML則著重描述如何將資料以結構化方式表示。
XML檔案格式是純文字格式,它由XML元素組成,每個XML元素包括一個開始標記,一個結束標記以及兩個標記之間的內容。標記是對檔案儲存格式和邏輯結構的描述。在形式上,標記中可能包括註釋、參照、字元資料段、起始標記、結束標記、空元素、檔案型別宣告( DTD)和序言。具體規則如下:1、必須有宣告語句<?xml version="1.0" encoding="utf-8"?>
;2、區分大小寫;3、XML檔案有且只有一個根元素;4、屬性值使用引號;5、所有的標記必須有相應的結束標記;6、所有的空標記也必須被關閉。
用XML表示中國部分省市如下:
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>中國</name>
<province>
<name>黑龍江</name>
<cities>
<city>哈爾濱</city>
<city>大慶</city>
</cities>
</province>
<province>
<name>廣東</name>
<cities>
<city>廣州</city>
<city>深圳</city>
<city>珠海</city>
</cities>
</province>
<province>
<name>臺灣</name>
<cities>
<city>臺北</city>
<city>高雄</city>
</cities>
</province>
<province>
<name>新疆</name>
<cities>
<city>烏魯木齊</city>
</cities>
</province>
</country>
JSON檔案被讀取到記憶體中後就變成了字串,而.NET操作JSON即生成與解析JSON字串。當前,C#操作JSON的方式主要有兩種:一、按照JSON字串解析;二、使用開源類庫Newtonsoft.Json,下載後新增dll參照即可直接呼叫。這裡使用後者進行JSON檔案的解析。
Newtonsoft.Json,是.Net中開源的Json序列化和反序列化工具,官方下載dll地址,功能比較多,效率比較高。比較常用的功能除了序列化發序列化之外,還有 Linq To Json、Json Path、 XML support等。下載Json130r1.zip後進行解壓,在Json130r1\Bin\net45資料夾下可以找到Newtonsoft.Json.dll動態連結庫檔案。
C#解析JSON檔案時新增參照瀏覽到Newtonsoft.Json.dll檔案,並且需要在C#程式碼中引入以下庫:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
下面的mark_20210517_141354.json檔案包含type、time、user、img和data
四個鍵,其中data下又包含userId、id、markId、name(值以unicode編碼)、address、temperature、dampness、type、latgitude、longitude、ampLat、ampLng、userName(值以unicode編碼)、createDate、describe(值以unicode編碼)和signId
。
mark_20210517_141354.json檔案內容如下:
{
"type": "mark",
"time": "2021-05-17 14:13:54",
"user": "17888830651",
"img": [
"JPEG_20210517_141333.jpg"
],
"data": {
"userId": "17888830651",
"id": "4",
"markId": "4",
"name": "\u6d4b\u8bd501",
"address": "",
"temperature": "35",
"dampness": "31",
"type": "\u5d29\u584c",
"latgitude": "3028.23286",
"longitude": "11431.60309",
"ampLat": "30.46797829546509",
"ampLng": "114.5319019906904",
"userName": "\u8f9b\u6d69\u6d69",
"createDate": "1621232032592",
"describe": "\u6b63\u5f0f\u6d4b\u8bd5\u8d77\u70b9",
"signId": "20210517_141354"
}
}
第一步,開啟Visual Studio 2015,新建C#->控制檯應用程式,專案名稱輸入CSharpParseJSON1後點選確定
第二步,在右側解決方案資源管理器下的CSharpParseJSON1專案上右鍵選擇新增->參照
在彈出的參照管理器視窗中點選左側瀏覽後會彈出選擇要參照的檔案視窗,選擇Newtonsoft.Json.dll檔案後確定即可,同時在右側的解決方案資源管理器下CSharpParseJSON1專案下的參照中可以看到Newtonsoft.Json。
第三步,將mark_20210517_141354.json檔案放到D:\搜狗高速下載目錄下
第四步,在Program.cs對應的完整程式碼如下,對照著複製到主函數中即可執行。
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
namespace CSharpParseJSON1
{
class Program
{
static void Main(string[] args)
{
String filepath= "D:\\搜狗高速下載\\mark_20210517_141354.json";
if (File.Exists(filepath))//存在
{
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
StreamReader file = new StreamReader(fs, System.Text.Encoding.Default);
JsonTextReader reader = new JsonTextReader(file);//解析json模組
JObject o = (JObject)JToken.ReadFrom(reader);
string type1 = o["type"].ToString();
string time = o["time"].ToString();
string user = o["user"].ToString();
string[] img = o["img"].ToString().Split('"');
string userId = o["data"]["userId"].ToString();
string id = o["data"]["id"].ToString();
string markId = o["data"]["markId"].ToString();
string name = o["data"]["name"].ToString();
string address = o["data"]["address"].ToString();
string temperature = o["data"]["temperature"].ToString();
string dampness = o["data"]["dampness"].ToString();
string type2 = o["data"]["type"].ToString();
string ampLat = o["data"]["ampLat"].ToString();
string ampLng = o["data"]["ampLng"].ToString();
string userName = o["data"]["userName"].ToString();
string createDate = o["data"]["createDate"].ToString();
string describe = o["data"]["describe"].ToString();
string signId = o["data"]["signId"].ToString();
reader.Close();
file.Close();
fs.Close();
string info = "type:" + type1 + "\n"
+ "time:" + time + "\n"
+ "user:" + user + "\n"
+ "img:" + img[1] + "\n"
+ "data:" + "\n"
+ " userId:" + userId + "\n"
+ " id:" + id + "\n"
+ " markId:" + markId + "\n"
+ " name:" + name + "\n"
+ " address:" + address + "\n"
+ " temperature:" + temperature + "\n"
+ " dampness:" + dampness + "\n"
+ " type:" + type2 + "\n"
+ " ampLat:" + ampLat + "\n"
+ " ampLng:" + ampLng + "\n"
+ " userName:" + userName + "\n"
+ " createDate:" + createDate + "\n"
+ " describe:" + describe + "\n"
+ " signId:" + signId + "\n";
Console.WriteLine(filepath+"解析結果如下:");
Console.Write(info);
string result1 = "D:\\搜狗高速下載\\result1.txt";//文字檔案模組
FileStream writetxt_fs = new FileStream(result1, FileMode.Create);
StreamWriter wr = new StreamWriter(writetxt_fs, System.Text.Encoding.Default);
wr.WriteLine(info);
wr.Close();
writetxt_fs.Close();
Console.WriteLine("解析結果已儲存到:"+result1);
}
}
}
}
第五步,執行結果如下圖所示,控制檯輸出瞭解析後的結果,同時解析結果也被儲存到了result1.txt中。
下面的coords.json檔案中每一行是一個json格式的字串,每一行json字串包含gpsLatLng、latLng、phone、userName 和 time
五個鍵,其中gpsLatLng又包含lat 和 lng
兩個鍵,latLng又包含latitude 和 longitude
兩個鍵。
coords.json檔案內容如下:
{"gpsLatLng": {"lat": 4000.04239, "lng": 11619.54174}, "latLng": {"latitude": 40.00200936705921, "longitude": 116.33184418780239}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:02.752"}
{"gpsLatLng": {"lat": 4000.04237, "lng": 11619.54266}, "latLng": {"latitude": 40.00200909635228, "longitude": 116.33185952246586}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:04.852"}
{"gpsLatLng": {"lat": 4000.04228, "lng": 11619.54301}, "latLng": {"latitude": 40.002007607397815, "longitude": 116.33186533544026}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:05.811"}
{"gpsLatLng": {"lat": 4000.0423, "lng": 11619.54327}, "latLng": {"latitude": 40.00200791583858, "longitude": 116.33186974545544}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:06.807"}
{"gpsLatLng": {"lat": 4000.0424, "lng": 11619.54389}, "latLng": {"latitude": 40.00200963564034, "longitude": 116.33188006902002}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:09.848"}
{"gpsLatLng": {"lat": 4000.04247, "lng": 11619.54417}, "latLng": {"latitude": 40.00201074468999, "longitude": 116.3318847798118}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:14.913"}
{"gpsLatLng": {"lat": 4000.04255, "lng": 11619.54401}, "latLng": {"latitude": 40.002012139577936, "longitude": 116.33188207385594}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:16.900"}
{"gpsLatLng": {"lat": 4000.04264, "lng": 11619.54389}, "latLng": {"latitude": 40.00201363581099, "longitude": 116.33188006949972}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:17.902"}
{"gpsLatLng": {"lat": 4000.04273, "lng": 11619.54376}, "latLng": {"latitude": 40.00201513166096, "longitude": 116.33187786468991}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:19.120"}
{"gpsLatLng": {"lat": 4000.04282, "lng": 11619.54364}, "latLng": {"latitude": 40.00201662789402, "longitude": 116.33187586033372}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:19.930"}
第一步,開啟Visual Studio 2015,新建C#->控制檯應用程式,專案名稱輸入CSharpParseJSON2後點選確定
第二步,在右側解決方案資源管理器下的CSharpParseJSON2專案上右鍵選擇新增->參照
在彈出的參照管理器視窗中點選左側瀏覽後會彈出選擇要參照的檔案視窗,選擇Newtonsoft.Json.dll檔案後確定即可,同時在右側的解決方案資源管理器下CSharpParseJSON2專案下的參照中可以看到Newtonsoft.Json。
第三步,將coords.json檔案放到D:\搜狗高速下載目錄下
第四步,在Program.cs對應的完整程式碼如下,對照著複製到主函數中即可執行。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace CSharpParseJSON2
{
class Program
{
static void Main(string[] args)
{
string filepath = @"D:\搜狗高速下載\coords.json";
if (File.Exists(filepath))//存在
{
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
StreamReader file = new StreamReader(fs, System.Text.Encoding.Default);
string linetxt = null;
double latitude = 0, longitude = 0;
string result1 = @"D:\搜狗高速下載\coordslatlon.txt";//文字檔案模組
FileStream writetxt_fs = new FileStream(result1, FileMode.Create);
StreamWriter wr = new StreamWriter(writetxt_fs, System.Text.Encoding.Default);
while ((linetxt = file.ReadLine()) != null)
{
JObject jo = (JObject)JsonConvert.DeserializeObject(linetxt);
string Lat = jo["gpsLatLng"]["lat"].ToString();
string Lng = jo["gpsLatLng"]["lng"].ToString();
double gpslat = double.Parse(Lat);
double gpslon = double.Parse(Lng);
gpslat = gpslat / 100.0 - (gpslat % 100.0) / 100.0 + (gpslat % 100.0) / 60.0;
gpslon = gpslon / 100.0 - (gpslon % 100.0) / 100.0 + (gpslon % 100.0) / 60.0;
string latLng_lat = jo["latLng"]["latitude"].ToString();
string latLng_lon = jo["latLng"]["longitude"].ToString();
string phone = jo["phone"].ToString();
string userName = jo["userName"].ToString();
string time = jo["time"].ToString();
string lineparsetxt = "GPS緯度:" + gpslat + "GPS經度:" + gpslon + "普通緯度:" + latLng_lat + "普通經度:" + latLng_lon
+ "電話:" + phone + "使用者名稱:" + userName + "時刻:" + time;
Console.WriteLine(lineparsetxt);
wr.WriteLine(lineparsetxt);
}
file.Close();
fs.Close();
wr.Close();
writetxt_fs.Close();
}
}
}
}
第五步,執行結果如下圖所示,控制檯輸出瞭解析後的結果,同時解析結果也被儲存到了coordslatlon.txt中。
C#解析XML檔案可以直接參照C#自帶的XML解析庫:using System.Xml;
第一步,開啟Visual Studio 2015,新建一個C#控制檯視窗應用程式,專案名稱輸入CSharpParseXML後點選確定
第二步,在右側解決方案資源管理器下CSharpParseXML專案上右鍵選擇新增->新建項
在新增新項視窗中選擇XML檔案,輸入process.xml為檔名後點選確定
然後在process.xml檔案中輸入以下內容,可以看到process節點下有多個action,每個action都有Type和Belongto這兩個屬性、actionid、name、ability和wait這四個目錄
。
<?xml version="1.0" encoding="utf-8" ?>
<process>
<action Type="Move" Belongto="Bed">
<actionid>1</actionid>
<name>GetUp</name>
<ability>早上起床</ability>
<wait>3</wait>
</action>
<action Type="Eat" Belongto="Brfast">
<actionid>2</actionid>
<name>EatBrfast</name>
<ability>吃早飯</ability>
<wait>5</wait>
</action>
<action Type="Eat" Belongto="Lunch">
<actionid>3</actionid>
<name>EatLunch</name>
<ability>吃午飯</ability>
<wait>4</wait>
</action>
<action Type="Eat" Belongto="Dinner">
<actionid>4</actionid>
<name>EatDinner</name>
<ability>吃晚飯</ability>
<wait>8</wait>
</action>
<action Type="Move" Belongto="Bed">
<actionid>5</actionid>
<name>GoToBed</name>
<ability>晚上睡覺</ability>
<wait>4</wait>
</action>
</process>
第三步,在Program.cs對應的完整程式碼如下,對照著複製到主函數中即可執行。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CSharpParseXML
{
class Program
{
static void Main(string[] args)
{
XmlDocument xd = new XmlDocument();
xd.Load(@"E:\計算智慧程式碼\CSharpParseXML\CSharpParseXML\process.xml");//載入xml檔案
XmlNode rootNode = xd.FirstChild;//得到xml檔案的根節點<?xml version="1.0" encoding="utf-8" ?>
rootNode = xd.SelectSingleNode("process");
XmlNodeList childNodes = rootNode.ChildNodes;//得到根節點下面的所有子節點
List<Action> actionList = new List<Action>();//建立character型別的列表
foreach (XmlNode p in childNodes)
{//遍歷各個角色
Action action = new Action();//建立一個角色,用來儲存查詢到的資訊
XmlNodeList contentList = p.ChildNodes;//得到該角色結點下的所有子節點
XmlElement xe = (XmlElement)p;
action.Type = xe.GetAttribute("Type").ToString();
action.Belongto = xe.GetAttribute("Belongto").ToString();
foreach (XmlNode content in contentList)
{//遍歷子節點
if (content.Name == "actionid")
{
action.ActionID = Int16.Parse(content.InnerText.ToString());
}
if (content.Name == "name")
{
action.Name = content.InnerText.ToString();
}
if (content.Name == "ability")
{
action.Ability = content.InnerText.ToString();
}
if (content.Name == "wait")
{
action.Wait = Int16.Parse(content.InnerText.ToString());
}
}
actionList.Add(action);//將建立的角色新增到角色列表
}
foreach (Action p in actionList)//遍歷角色資訊
Console.WriteLine(p.ToString());
Console.ReadKey();
}
}
class Action
{
public Action() { }
public string Type { get; set; }
public string Belongto { get; set; }
public int ActionID { get; set; }
public string Name { get; set; }
public string Ability { get; set; }
public int Wait { get; set; }
public override string ToString()
{
return string.Format("型別:{0}\t隸屬於:{1}\t序號:{2}\t名稱:{3}\t功能:{4}\t時長:{5}s", Type, Belongto, ActionID, Name, Ability, Wait);
}
}
}
第四步,執行結果如下圖所示,控制檯輸出瞭解析後的結果。