1. 程式人生 > 實用技巧 >C#動態實體集的反序列化(動態JSON反序列化)

C#動態實體集的反序列化(動態JSON反序列化)

一、使用場景

我們在將 JSON 反序列化實體集的時候,如果欄位是固定的,那麼我們序列化非常簡單,對應欄位寫的實體集就可以了。比如下面這種:

{
    "data":[
            {
                "houseid": "210166268", 
                "city": "唐山", 
                "pv": "1"
            }
        ],
    "message": "Success"
}

但是我們如何處理 動態的JSON資料(沒有固定欄位),比如下面結構:,是不是懵逼了呀,因為有一個時間節點,它是不固定的,下面,我們就開始介紹如何 反序列化下面的格式。

//注意下面的時間節點不固定,我們無法對應指定欄位
{
    "content": {
        "20180123": [
            {
                "houseid": "210166268", 
                "city": "唐山", 
                "pv": "1"
            }, 
            {
                "houseid": "210181300", 
                "city": "唐山", 
                "pv": "1"
            }
        ],
        "20180124"
: [ { "houseid": "210166268", "city": "唐山", "pv": "1" } ] }, "message": "Success" }

二、動態實體集反序列化

需要引入: Newtonsoft.Json。

假設我們要把 上面的每天的房源資訊(houseid, city, pv) 序列化成一個列表。 程式碼如下:

//最終目標格式
public class DataModel
{

 //日期字串        
public string DateStr { get; set; } //每天資訊列表 public List<EntityModel> EntityList { get; set; } } //資料模型 public class EntityModel { public string HouseId { get; set; } public string City { get; set; } public string PV { get; set; } public override string ToString() { return HouseId +City +PV; } }

2.1 處理結果

2.2 處理邏輯

//解析
Newtonsoft.Json.Linq.JObject resultObject = Newtonsoft.Json.Linq.JObject.Parse(resultStr);

//轉換成列表(取得Content)
List<Newtonsoft.Json.Linq.JToken> listJToken = resultObject["content"].Children().ToList();

//遍歷
foreach (var item in listJToken)
{
    //轉成鍵值對格式
    var temp_item = (Newtonsoft.Json.Linq.JProperty)item;
    Console.WriteLine("Name:" + temp_item.Name + "\nValue:"  + temp_item.Value );
    Console.WriteLine("------------------------------------------------------------------------");

    //TODO: 下面的步驟大家應該都知道了,如果要獲取 List<EntityModel> 型別,直接把value 序列化就可以。
    //var temp_list = JsonConvert.DeserializeObject<List<EntityModel>>(temp_item.Value.ToString());
}