C#解析JSON字串總結

阿木醬發表於2018-11-29

JSON檔案讀取到記憶體中就是字串,.NET操作JSON就是生成與解析JSON字串。

操作JSON通常有以下幾種方式:

  1. 原始方式:按照JSON字串自己來解析。

  2. 通用方式【★★★★★】:這種方式是使用開源的類庫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;//返回訊息,對返回碼的描述
    string jsonStr = "{\"RetCode\":3,\"ReturnMessage\":\"測試訊息\"}";
    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列表資料:

public static JArray GetData2JArray(string url, string key)
{
    string jsonData = HttpHelper.HttpGet(url, "", "gb2312"); 
    JObject obj = JObject.Parse(jsonData);
    return (JArray)obj[key];
}
複製程式碼

以上Json的返回的資料:

{"Pictures":
[
{"PictureSrc":"http://i.ssimg.cn/ssupload/2016/10/17/707f464645f44b4cb9882b75d23ed8f9.png","PictureLink":"","PictureAlt":"通光線纜 36.50%","PictureTitle":"實盤賽冠軍直播室","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":"證券之星最強王牌播主","PictureTitleLink":"1716","PictureSummary":"深入股海數年,擁有十餘年的實戰經驗。2014年證券之星播主年度冠軍,各大一線網站著名部落格,多次接受電視臺專訪。","OrderTime":"2016-10-17 13:12:34"}
]
}
複製程式碼

解析成自定義實體類列表:

#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實體類的定義:

JSON生成實體類工具:點選>>

參考:序列化Json-Newtonsoft.Json

解析JsonArrayList

轉換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字串陣列格式解析

string jsonArrayText = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]"; //"[{'a':'a1','b':'b1'}]即使只有一個元素,也需要加上[]
string jsonArrayText = "[{\"a\":\"a1\",\"b\":\"b1\"},{\"a\":\"a2\",\"b\":\"b2\"}]";  //上面寫法和此寫法效果一樣
JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonArrayText);//jsonArrayText必須是帶[]陣列格式字串
string str = jArray[0]["a"].ToString();
複製程式碼
  1. 內建方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization名稱空間下的JavaScriptSerializer類進行物件的序列化與反序列化,很直接。
Project p1 = new Project() { Input = "stone", Output = "gold" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonStr = serializer.Serialize(p1);  //序列化:物件=>JSON字串
Response.Write(jsonStr);

Project p2 = serializer.Deserialize<Project>(jsonStr); //反序列化:JSON字串=>物件
Response.Write(p1.Input + "=>" + p2.Output);
複製程式碼

  注意:如果使用的是VS2010,則要求當前的工程的 Target Framework要改成.Net Framework 4,不能使用Client Profile。當然這個System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感覺有點浪費資源。   此外,從最後一句也可以看到,序列化與反序列化是深拷貝的一種典型的實現方式。

相關文章