如何在C#中反序列化根节点为动态属性名的JSON?
解决C#中动态根属性的JSON反序列化问题
你的问题核心是JSON的根节点是动态属性名(此处为GUID字符串),而你定义的GameStopNftListing类结构和JSON实际结构不匹配,导致反序列化失败。下面提供两种常用JSON库的解决方案:
方案1:使用Newtonsoft.Json(Json.NET)
直接将整个JSON反序列化为Dictionary<string, Value>类型,动态键会作为字典的Key,对应的值就是你定义的Value对象:
首先保留正确的Value和LoopringSaleInfo类定义(无需GameStopNftListing类):
public class LoopringSaleInfo { public string? minPricePerNftInWei { get; set; } public string? amountForSale { get; set; } } public class Value { public string? minPricePerNft { get; set; } public string? amountForSale { get; set; } public LoopringSaleInfo? loopringSaleInfo { get; set; } public int likeCount { get; set; } }
执行反序列化并获取数据:
string jsonStr = "你的目标JSON字符串"; var result = JsonConvert.DeserializeObject<Dictionary<string, Value>>(jsonStr); // 提取动态键对应的业务数据 if (result != null && result.Count > 0) { string dynamicGuidKey = result.Keys.First(); Value nftListing = result[dynamicGuidKey]; // 后续处理nftListing对象 }
方案2:使用System.Text.Json(.NET内置库)
同样支持字典反序列化,或者用JsonDocument手动解析:
方式A:字典反序列化
string jsonStr = "你的目标JSON字符串"; var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var result = JsonSerializer.Deserialize<Dictionary<string, Value>>(jsonStr, options); // 获取动态键与对应数据 if (result != null && result.Count > 0) { var firstEntry = result.First(); string dynamicGuidKey = firstEntry.Key; Value nftListing = firstEntry.Value; }
方式B:JsonDocument手动解析(适合无需完整类的场景)
string jsonStr = "你的目标JSON字符串"; using var doc = JsonDocument.Parse(jsonStr); var root = doc.RootElement; // 遍历根节点唯一的动态属性 foreach (var property in root.EnumerateObject()) { string dynamicGuidKey = property.Name; Value nftListing = property.Value.Deserialize<Value>(new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); }
原类定义无效的原因
你定义的GameStopNftListing类包含@class和value两个属性,但你的JSON根节点并没有这两个字段,而是直接以动态GUID为键、Value结构为值的对象,两者结构完全不匹配,因此无法正确反序列化。
内容的提问来源于stack exchange,提问作者John-Michael
相关产品推荐
相关产品推荐

