C#动态实体集的反序列化(动态JSON反序列化)

Posted netlock

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 + "
Value:"  + temp_item.Value );
    Console.WriteLine("------------------------------------------------------------------------");

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

 

技术图片

技术图片

以上是关于C#动态实体集的反序列化(动态JSON反序列化)的主要内容,如果未能解决你的问题,请参考以下文章

使用动态键将json反序列化为C#

C#中具有多个对象的JSON文件的反序列​​化

.net 3.5 中的反序列化对象

C# dynamic类型序列化和反序列化之Newtonsoft.Json,动态解析远端返回的jSON数据

Json 使用动态属性名称反序列化对象数组

动态代码评估:不安全的反序列化(Spring Boot 2) - 如何避免与执行器相关的强化问题,还是误报?