C# 实体转成json,其中实体类中有字典Dictionary,遇到的问题,以及最终解决(Json序列化、反序列化之Dictionary 字典类型)

实习过程中的一个项目环节,是我之前没接触过的-------------实体转json,然后服务器客户端json传值

在实体转json 的时候遇到了一个问题,实体类中有字典类型的字段,用其他方法将实体对象转json总是报错,后来用

            string str = JsonConvert.SerializeObject(dic);

  这个方法成功解决,其中参数dic是一个包含字典类型字段的实体对象,成功转成json字符串。

 

Json序列化、反序列化之Dictionary 字典类型,还有些问题可参照 https://blog.csdn.net/qq_42335551/article/details/81224463

C# 中,如果需要解析 JSON 数据但又不想提前创建对应的类结构(例如实体模型),可以利用 `dynamic` 类型、匿名对象或基于字典的方式来进行操作。 以下是几种常见的解决办法: --- ### **方法一:使用 `JObject` 或者 `JsonDocument`** 通过 NewtonSoft.Json 库提供的 `JObject` 来动态读取数据内容: ```csharp using Newtonsoft.Json.Linq; string json = "{\"name\":\"张三\",\"age\":25}"; JObject jObj = JObject.Parse(json); // 动态访问属性值 string name = (string)jObj["name"]; int age = (int)jObj["age"]; Console.WriteLine($"Name: {name}, Age: {age}"); ``` 或者直接遍历整个 JSON 结构: ```csharp foreach (var item in jObj) { Console.WriteLine($"{item.Key}: {item.Value}"); } ``` 这种方式无需事先定义具体的类类型即可完成对 JSON 的解析。 --- ### **方法二:借助 `ExpandoObject` 和 Dynamic 关键词** 也可以采用 .NET 自带的 `System.Dynamic.ExpandoObject` ,将它当作 Dictionary 使用,并结合 dynamic 完成非强类型的访问需求示例如下所示: ```csharp using System; using System.Collections.Generic; using System.Dynamic; using System.Text.Json; public static ExpandoObject ParseToExpando(string jsonString) { var expando = new ExpandoObject() as IDictionary<string, object>; using(var doc = JsonDocument.Parse(jsonString)) { foreach(var property in doc.RootElement.EnumerateObject()) expando[property.Name] = GetPropertyValue(property.Value); } return expando; } private static object GetPropertyValue(JsonElement value) { switch(value.ValueKind){ case JsonValueKind.Object: //递归处理嵌套的对象 return ParseToExpando(value.ToString()); case JsonValueKind.Array: //处理数组情况下的元素转换 return value.EnumerateArray().Select(GetPropertyValue).ToList(); default://基础类型如字符串数字等则返回其原始值 return value.GetRawText(); } } static void Main() { string jsonData=@"{'Person':{'FirstName':'John','LastName':'Smith'}, 'Age':40}"; dynamic personInfo=ParseToExpando(jsonData); Console.WriteLine(personInfo.Person.FirstName); //"John" } ``` 上面展示了从简单到复杂包括嵌套字段以及列表在内的全面支持方案。其中核心在于自定义了一个辅助函数用于判断不同类型数据节点再做相应地转化工作最终使得我们可以像操纵普通对象那样轻松获取任意层级的信息而不用关心底层实际存储形式是什么样的。 --- ### **总结** 当不确定JSON的具体格式或者是临时性任务时上述提到的技术都非常有用;但如果经常需要用到某个特定模式下的序列化反序列化进程的话还是推荐预先建立好相应的POCO(Plain Old CLR Object),以便于提高程序运行效率同时增强代码可维护性和健壮程度!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值