ASP.NET Core .NET RC2解析JSON为dynamic对象遇CS1061错误求助
解决ASP.NET Core RC2中Newtonsoft.Json解析dynamic对象时的CS1061错误
我之前在ASP.NET Core RC2里也遇到过一模一样的问题,本质是早期.NET Core版本对dynamic类型与Newtonsoft.Json的JObject交互支持不够完善,加上编译时的类型绑定限制导致的。下面给你拆解问题原因和几种可行的解决方案:
问题原因
当你用JObject.Parse或者JsonConvert.DeserializeObject<dynamic>时,返回的对象本质是JObject实例。在.NET Core RC2这个早期版本中,编译器无法正确识别JObject的动态属性成员,所以直接用.访问success这类属性时,会触发CS1061编译错误——虽然运行时通过动态绑定其实能访问到,但编译阶段就被拦截了。
另外,你的JSON字符串用了单引号,虽然Newtonsoft.Json兼容这种写法,但标准JSON要求用双引号,建议后续改成标准格式,避免潜在的解析问题。
解决方案
1. 使用索引器访问(最简单直接)
JObject本身是键值对集合,你可以通过索引器来访问属性,然后显式转换类型:
string jsn = @"{""success"": false, ""error"": { ""code"": 101, ""type"": ""missing_access_key"", ""info"": ""You have not supplied an API Access Key. [Required format: access_key=YOUR_ACCESS_KEY]"" }}"; // 用JObject.Parse的情况 JObject jObject2 = JObject.Parse(jsn); bool success = (bool)jObject2["success"]; int errorCode = (int)jObject2["error"]["code"]; string errorInfo = (string)jObject2["error"]["info"]; // 用JsonConvert.DeserializeObject的情况 dynamic s2 = JsonConvert.DeserializeObject(jsn); bool success2 = (bool)s2["success"];
2. 定义强类型实体类(推荐,更安全)
如果你的JSON结构固定,最稳妥的方式是定义对应的实体类,反序列化到强类型对象,这样不仅不会有编译错误,还能获得类型检查和智能提示:
// 定义实体类 public class ApiResponse { [JsonProperty("success")] public bool Success { get; set; } [JsonProperty("error")] public ErrorDetail Error { get; set; } } public class ErrorDetail { [JsonProperty("code")] public int Code { get; set; } [JsonProperty("type")] public string Type { get; set; } [JsonProperty("info")] public string Info { get; set; } } // 反序列化并访问属性 var response = JsonConvert.DeserializeObject<ApiResponse>(jsn); bool success = response.Success; int errorCode = response.Error.Code; string errorInfo = response.Error.Info;
3. 转换为ExpandoObject实现.访问动态属性
如果你坚持要用dynamic加.访问,可以把JObject转换成ExpandoObject,它能完美支持动态属性的点符号访问:
// 方式1:直接反序列化为ExpandoObject dynamic expandoObj = JsonConvert.DeserializeObject<ExpandoObject>(jsn); bool success = expandoObj.success; int errorCode = expandoObj.error.code; // 方式2:从JObject转换为ExpandoObject JObject jObject2 = JObject.Parse(jsn); dynamic dynamicObj = jObject2.ToObject<ExpandoObject>(); string errorType = dynamicObj.error.type;
内容的提问来源于stack exchange,提问作者user3799325
相关产品推荐
相关产品推荐

