C#使用JObject.Parse解析JSON报错如何提取customerName字段值
错误产生原因
这个报错的核心原因是JSON嵌套转义错误:
你定义的JSON中,billDetails、billerResponse、additionalInfo三个字段的值本身是序列化后的JSON字符串,这类嵌套在JSON里的字符串类型JSON,内部的双引号需要做转义处理。但你在C#中定义字符串时,只做了C#层面的双引号转义,没有处理JSON层面的嵌套转义,导致最终传给JObject.Parse的原始JSON文本中,billDetails的字符串值在碰到内部的"时就被解析器判定为提前结束,后续的n(name字段的首字母)就成了非法意外字符,触发报错。
解决方法
步骤1:修正JSON字符串转义
如果是硬编码的测试字符串,推荐使用C#逐字字符串(前缀加@)降低转义复杂度,内部双引号用两个双引号转义,嵌套JSON中的双引号额外加反斜杠转义,修正后的字符串定义如下:
string aaaa = @" { ""respCode"":""1"", ""status"":""SUCCESS"", ""response"":{ ""chId"":1, ""refId"":""YBL4ABC0D3D61A349F18605928DD63E8886"", ""approvalRefNum"":""264992511"", ""responseCode"":""000"", ""responseReason"":""Successful"", ""complianceReason"":"""", ""complianceRespCd"":"""", ""billDetails"":""[{\""name\"":\""Consumer Number\"",\""value\"":\""900001073788\""}]"", ""billerResponse"":""{\""customerName\"":\""MNTALI\"",\""amount\"":\""421\"",\""dueDate\"":\""2021-11-06\"",\""custConvFee\"":\""\"",\""custConvDesc\"":\""\"",\""billDate\"":\""2021-10-16\"",\""billNumber\"":\""9337718556142\"",\""billPeriod\"":\""MONTHLY\"",\""billTags\"":[{\""name\"":\""Early Payment Amount\"",\""value\"":\""41200\""}]}"", ""additionalInfo"":""[{\""name\"":\""Early Payment Date\"",\""value\"":\""2021-10-23\""},{\""name\"":\""URL\"",\""value\"":\""https://cp.tatapower.com:4443/inv?inv_nou003dMDkzMzc3MTg2MTQy\""}]"" } }";
如果该字符串是从外部接口、存储介质获取的,说明数据源返回的JSON本身不符合规范,需要要求提供方修正嵌套JSON的转义逻辑。
步骤2:分层解析提取字段
因为customerName存放在嵌套的billerResponse字符串中,需要先解析外层JSON,再二次解析billerResponse的内容,代码如下:
// 解析外层JSON var userObj1 = JObject.Parse(aaaa); // 提取billerResponse字段的字符串值,二次解析为JSON对象 var billerResponse = JObject.Parse(userObj1["response"]["billerResponse"].ToString()); // 获取customerName的值 string customerName = billerResponse["customerName"].ToString();
内容的提问来源于stack exchange,提问作者Mohsin Khan
相关产品推荐
相关产品推荐

