如何将JSON属性字典反序列化为对应的原始C#对象类型?
实现字典到原始对象的反向转换方法
你现有正向转换方法基于Json.NET的JObject实现,反向转换同样可以依托JObject作为中转,用单行LINQ即可完成,和你现有方法的依赖完全一致。
现有正向方法回顾
public static Dictionary<string, string> GetObjectPropertiesAsDic<T>(T obj) where T : class { return JObject.FromObject(obj).Properties().ToDictionary(k => k.Name, v => v.Value?.ToString()); }
反向转换实现代码
using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.Linq; public static T DicToObject<T>(Dictionary<string, string> propertyDic) where T : class, new() { return new JObject(propertyDic.Select(kv => new JProperty(kv.Key, kv.Value == null ? JValue.CreateNull() : new JValue(kv.Value)))).ToObject<T>(); }
注意点
- 泛型约束增加
new()是为了保证目标类型有无参构造函数,和绝大多数业务实体类的定义兼容 - 代码单独处理了字典值为
null的分支,避免空值转换抛出异常 - 反序列化过程会自动按照目标类型的属性类型做值转换,比如数值、布尔值、日期、枚举等常见类型,只要正向序列化时
ToString()输出的内容符合对应类型的JSON格式规范,都可以正确还原 - 如果有特殊格式需求(比如自定义日期格式、枚举序列化规则),可以给
ToObject<T>()传入自定义配置的JsonSerializer实例调整转换逻辑。
调用示例
// 定义测试实体 public class Product { public string ProductName { get; set; } public decimal Price { get; set; } public int Stock { get; set; } public bool OnSale { get; set; } } // 正向转字典 var product = new Product { ProductName = "Mechanical Keyboard", Price = 399.99m, Stock = 120, OnSale = true }; var propertyDic = GetObjectPropertiesAsDic(product); // 反向还原实体 var restoredProduct = DicToObject<Product>(propertyDic);
内容的提问来源于stack exchange,提问作者Veverke
相关产品推荐
相关产品推荐

