c#解析json字符串处理清晰易懂的方法
JSON文件讀取到內(nèi)存中就是字符串,.NET操作JSON就是生成與解析JSON字符串。
操作JSON通常有以下幾種方式:
1. 原始方式:按照J(rèn)SON字符串自己來解析。
?
2. 通用方式【★★★★★】:這種方式是使用開源的類庫(kù)Newtonsoft.Json(下載地址http://json.codeplex.com/)。下載后添加dll引用就能用。
首先添加引用:using Newtonsoft.Json;
新增:本地dll下載:Newtonsoft.Json.rar?? 引用:using Newtonsoft.Json;
?
1.Json字符串普通格式解析(常用)
string jsonText = "{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}"; JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText); string zone = jo["zone"].ToString(); string zone_en = jo["zone_en"].ToString();?
其他寫法:
int retCode = -1;//返回碼,0表示成功,其他表示失敗string returnMessage = string.Empty;//返回消息,對(duì)返回碼的描述string jsonStr = "{\"RetCode\":3,\"ReturnMessage\":\"測(cè)試消息\"}";JavaScriptObject jsonObj = JavaScriptConvert.DeserializeObject<JavaScriptObject>(jsonStr);if (jsonObj != null){if (jsonObj.ContainsKey("RetCode") && jsonObj["RetCode"] != null){int.TryParse(jsonObj["RetCode"].ToString(), out retCode);}if (jsonObj.ContainsKey("ReturnMessage") && jsonObj["ReturnMessage"] != null){returnMessage = jsonObj["ReturnMessage"].ToString();}}?
解析Josn列表數(shù)據(jù):
public static JArray GetData2JArray(string url, string key) {string jsonData = HttpHelper.HttpGet(url, "", "gb2312"); JObject obj = JObject.Parse(jsonData);return (JArray)obj[key]; }以上Json的返回的數(shù)據(jù):
{"Pictures": [ {"PictureSrc":"http://i.ssimg.cn/ssupload/2016/10/17/707f464645f44b4cb9882b75d23ed8f9.png","PictureLink":"","PictureAlt":"通光線纜 36.50%","PictureTitle":"實(shí)盤賽冠軍直播室","PictureTitleLink":"132","PictureSummary":"荷塘月色直播室是由野馬和荷塘月色夫妻倆共同直播的直播室,野馬以短線股為主,荷塘月色以中線股為主,擅于抓漲停板和翻倍牛股。","OrderTime":"2016-10-17 13:16:04"}, {"PictureSrc":"http://i.ssimg.cn/ssupload/2016/10/17/4c38b0a2604e49beaf1e4f7885e6a1a4.png","PictureLink":"","PictureAlt":"天際股份 6.38%","PictureTitle":"證券之星最強(qiáng)王牌播主","PictureTitleLink":"1716","PictureSummary":"深入股海數(shù)年,擁有十余年的實(shí)戰(zhàn)經(jīng)驗(yàn)。2014年證券之星播主年度冠軍,各大一線網(wǎng)站著名博客,多次接受電視臺(tái)專訪。","OrderTime":"2016-10-17 13:12:34"} ] }解析成自定義實(shí)體類列表:
#region 獲取手編列表 /// <summary> /// 獲取手編列表 /// </summary> /// <returns></returns> public static List<Pictures> GetHandWriteList() {List<Pictures> list = new List<Pictures>();var data = Common.LiveCastUserManageAPI.GetData2JArray(CmsApiSite, "Pictures");if (data != null && data.Count > 0){foreach (var item in data){Pictures p = new Pictures();if (!string.IsNullOrEmpty(item["PictureSrc"].ToString())){p.PictureSrc = item["PictureSrc"].ToString();}list.Add(p);}}return list; } #endregion Pictures實(shí)體類的定義:JSON生成實(shí)體類工具:點(diǎn)擊>>
?
參考:序列化Json-Newtonsoft.Json
解析JsonArrayList
轉(zhuǎn)換json格式為C#類
?
2.Json字符串嵌套格式解析
string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}"; JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText); string zone = jo["beijing"]["zone"].ToString(); string zone_en = jo["beijing"]["zone_en"].ToString();3.Json字符串?dāng)?shù)組格式解析
string jsonArrayText = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]"; //"[{'a':'a1','b':'b1'}]即使只有一個(gè)元素,也需要加上[] string jsonArrayText = "[{\"a\":\"a1\",\"b\":\"b1\"},{\"a\":\"a2\",\"b\":\"b2\"}]"; //上面寫法和此寫法效果一樣 JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonArrayText);//jsonArrayText必須是帶[]數(shù)組格式字符串 string str = jArray[0]["a"].ToString();?
3. 內(nèi)置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空間下的JavaScriptSerializer類進(jìn)行對(duì)象的序列化與反序列化,很直接。
Project p1 = new Project() { Input = "stone", Output = "gold" }; JavaScriptSerializer serializer = new JavaScriptSerializer(); string jsonStr = serializer.Serialize(p1); //序列化:對(duì)象=>JSON字符串 Response.Write(jsonStr);Project p2 = serializer.Deserialize<Project>(jsonStr); //反序列化:JSON字符串=>對(duì)象 Response.Write(p1.Input + "=>" + p2.Output); 注意:如果使用的是VS2010,則要求當(dāng)前的工程的 Target Framework要改成.Net Framework 4,不能使用Client Profile。當(dāng)然這個(gè)System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感覺有點(diǎn)浪費(fèi)資源。
此外,從最后一句也可以看到,序列化與反序列化是深拷貝的一種典型的實(shí)現(xiàn)方式。
?
備注:
json格式字符串轉(zhuǎn)換為實(shí)體類,大括號(hào){}表示對(duì)象,[]數(shù)組表示列表。
?
//*******************
需求:
假設(shè)有如下json字符串:
{
? ? "companyID": "15",
?
? ? "employees": [
? ? ? ? {
? ? ? ? ? ? "firstName": "Bill",
? ? ? ? ? ? "lastName": "Gates"
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "firstName": "George",
? ? ? ? ? ? "lastName": "Bush"
? ? ? ? }
? ? ],
?
? ? "manager": [
? ? ? ? {
? ? ? ? ? ? "salary": "6000",
? ? ? ? ? ? "age": "23"
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "salary": "8000",
? ? ? ? ? ? "age": "26"
? ? ? ? }
? ? ]
?
}
請(qǐng)利用C#處理這個(gè)字符串,在控制臺(tái)顯示出公司的ID,第一位員工的姓,和所有管理者的工資。
解決步驟:
(為了更清晰的說明,本例在控制臺(tái)中測(cè)試,本人編程環(huán)境VS2015)
1、下載開源的類庫(kù)Newtonsoft.Json(下載地址 http://json.codeplex.com/ )。
// 20190105更新,之前這個(gè)網(wǎng)站是直接一個(gè)大按鈕下載dll的,好像現(xiàn)在變復(fù)雜了2333,也可以去里面的github-release鏈接里,下載最新壓縮包json-xxx.zip,解壓找到自己對(duì)應(yīng)的.net版本的Newtonsoft.Json.dll?
2、在VS中新建項(xiàng)目——控制臺(tái)應(yīng)用程序。
3、引用類庫(kù):在VS中點(diǎn)擊:項(xiàng)目——引用——瀏覽——找到你剛才下載的Newtonsoft.Json.dll——確定。
4、在主程序Program.cs的開頭添加?using Newtonsoft.Json; ?這一語句。
5、把要處理的json字符串復(fù)制到?http://json2csharp.chahuo.com/ ?得到C#類,如圖所示:
把這部分內(nèi)容復(fù)制,粘貼到class Program類的下方。
6、為了方便演示,把我給的json字符串賦值給一個(gè)變量。但是json中有很多的引號(hào),賦值給一個(gè)string變量還要加上很多的反斜杠。這里再給大家一個(gè)在線工具:http://tool.chinaz.com/tools/jsonescape.aspx
將我剛才給的東西復(fù)制進(jìn)去點(diǎn)擊“壓縮并轉(zhuǎn)義”,得到的值可以直接賦值給一個(gè)string變量,如圖:
PS:如果能從別的地方比如webAPI得到j(luò)son字符串那更好,直接賦值給一個(gè)string變量后進(jìn)行下面的操作,省去了轉(zhuǎn)義這一步。
string jsonText = " {\"companyID\":\"15\",\"employees\":[{\"firstName\":\"Bill\",\"lastName\":\"Gates\"},{\"firstName\":\"George\",\"lastName\":\"Bush\"}],\"manager\":[{\"salary\":\"6000\",\"age\":\"23\"},{\"salary\":\"8000\",\"age\":\"26\"}]} ?";
7、反序列化json字符串得到對(duì)象。
RootObject rb = JsonConvert.DeserializeObject<RootObject>(jsonText);
8、處理對(duì)象,如輸出公司ID:
Console.WriteLine(rb.companyID);
?
完整代碼如下(引用NewtonSoft.Json.dll后可直接運(yùn)行):
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
?
namespace ConsoleJsonTest
{
? ? class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
?
? ? ? ? ? ? string jsonText = " {\"companyID\":\"15\",\"employees\":[{\"firstName\":\"Bill\",\"lastName\":\"Gates\"},{\"firstName\":\"George\",\"lastName\":\"Bush\"}],\"manager\":[{\"salary\":\"6000\",\"age\":\"23\"},{\"salary\":\"8000\",\"age\":\"26\"}]} ";
? ? ? ? ? ? Console.WriteLine(jsonText);
?
? ? ? ? ? ? RootObject rb = JsonConvert.DeserializeObject<RootObject>(jsonText);
?
? ? ? ? ? ? Console.WriteLine(rb.companyID);
?
? ? ? ? ? ? Console.WriteLine(rb.employees[0].firstName);
?
? ? ? ? ? ? foreach (Manager ep in rb.manager)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine(ep.age);
? ? ? ? ? ? }
?
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }
? ? }
?
? ? public class Employees
? ? {
? ? ? ? public string firstName { get; set; }
? ? ? ? public string lastName { get; set; }
? ? }
?
? ? public class Manager
? ? {
? ? ? ? public string salary { get; set; }
? ? ? ? public string age { get; set; }
? ? }
?
? ? public class RootObject
? ? {
? ? ? ? public string companyID { get; set; }
? ? ? ? public List<Employees> employees { get; set; }
? ? ? ? public List<Manager> manager { get; set; }
? ? }
}
?
輸出結(jié)果:
說明:對(duì)于json字符串中的數(shù)組,如本例中的employees或者manager,用這篇文章里的在線工具會(huì)自動(dòng)生成泛型列表List<T>。關(guān)于泛型列表的有關(guān)內(nèi)容在這篇文章里就不再贅述了,大家可以直接把它當(dāng)成數(shù)組使用。遍歷數(shù)組的方法在此依然適用,例如代碼中的:
foreach (Manager ep in rb.manager)
?{
? ? ? ? ? ? Console.WriteLine(ep.age);
?}
?
?
———————————————————————————————————————
看到有的人問如何把對(duì)象轉(zhuǎn)換成json,我這邊就補(bǔ)充一下吧,其實(shí)同樣也是用這個(gè)庫(kù)自帶的方法,代碼如下:
(直接加在Console.ReadKey()上面就可以運(yùn)行了)
Employees e1 = new Employees();
e1.firstName = "Ma";
e1.lastName = "Yun";
?
Manager m1 = new Manager();
m1.salary = "6666";
m1.age = "30";
?
RootObject robj = new RootObject();
robj.employees = new List<Employees>();
robj.manager = new List<Manager>();
?
robj.companyID = "ALI BABA";
robj.employees.Add(e1);
robj.manager.Add(m1);
?
string str = JsonConvert.SerializeObject(robj);
Console.WriteLine(str);
就是調(diào)用庫(kù)里面的SerializeObject方法,傳入賦值好的對(duì)象就好了
最后程序輸出json字符串:
{"companyID":"ALI BABA","employees":[{"firstName":"Ma","lastName":"Yun"}],"manager":[{"salary":"6666","age":"30"}]}
?
總結(jié)
以上是生活随笔為你收集整理的c#解析json字符串处理清晰易懂的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你辛苦来人间一趟,不是来作任务的,你应该
- 下一篇: jQuery 实现表格与 ckeckbo