使用NewtonSoft JSON Convert解析JSON遇阻:无法构建对应C#类
处理带动态键的JSON解析问题(NewtonSoft.Json)
我懂你现在卡在哪了——这个JSON里的merchants字段全是动态生成的键名,像RZX9YMHSMP6A8、MNOVJT2ZRRRSC这种,常规的固定C#类根本没法对应上对吧?别担心,NewtonSoft.Json(也就是Json.NET)专门有针对这种动态键场景的解决方案,给你两种实用的处理方式:
方法一:强类型字典映射(推荐用于长期维护的代码)
这种方式用Dictionary<string, List<T>>来匹配merchants下的动态键结构,既保留强类型的优势,又能兼容动态键。
首先定义子对象的类,对应每个商家下的操作条目:
public class MerchantAction { public string objectId { get; set; } public string type { get; set; } public long ts { get; set; } }
然后定义根对象类,把merchants字段设为字典类型:
public class RootJsonModel { public string appId { get; set; } public Dictionary<string, List<MerchantAction>> merchants { get; set; } }
最后用Json.NET解析即可:
// 替换成你的JSON字符串 string jsonContent = "{ \"appId\":\"G9RNVJYTS6SFY\", \"merchants\":{ \"RZX9YMHSMP6A8\":[{ \"objectId\":\"A:G9RNVJYTS6SFY\", \"type\":\"DELETE\", \"ts\":1522736100111 }], \"MNOVJT2ZRRRSC\":[{ \"objectId\":\"A:G9RNVJYTS6SFY\", \"type\":\"CREATE\", \"ts\":1522736100111 }] } }"; RootJsonModel parsedResult = JsonConvert.DeserializeObject<RootJsonModel>(jsonContent); // 访问动态键的示例 var rzxActions = parsedResult.merchants["RZX9YMHSMP6A8"]; foreach (var action in rzxActions) { Console.WriteLine($"操作类型:{action.type},时间戳:{action.ts}"); }
方法二:动态JObject解析(适合临时/灵活处理场景)
如果不需要完整的强类型映射,也可以用JObject动态遍历解析,省去定义类的步骤:
string jsonContent = "你的JSON字符串"; JObject jsonObj = JObject.Parse(jsonContent); // 获取appId string appId = jsonObj["appId"].ToString(); // 遍历所有商家的动态键 foreach (JProperty merchantProp in jsonObj["merchants"].Children<JProperty>()) { string merchantKey = merchantProp.Name; // 比如RZX9YMHSMP6A8 var actionList = merchantProp.Value.ToObject<List<MerchantAction>>(); // 处理当前商家的操作 Console.WriteLine($"商家ID:{merchantKey}"); foreach (var action in actionList) { Console.WriteLine($" - 操作:{action.type},时间:{action.ts}"); } }
两种方式各有优势:强类型字典适合需要长期维护、依赖智能提示的项目;动态解析则更灵活,适合快速处理临时数据的场景。
内容的提问来源于stack exchange,提问作者7405
相关产品推荐
相关产品推荐

