我在C# Windows Form应用程序中使用 JSON.net 将JSON字符串反序列化为动态对象:
dynamic jsonObj = JsonConvert.DeserializeObject(strJson);
我使用以下测试 JSON 进行测试:
{"payload":"thePayload","number":3,"dialogResult":"one"}
当我运行代码时,我确实可以使用关联数组方法访问动态对象的属性:
var x = jsonObj["payload"];
但是,如果我尝试使用属性名称访问内容:
var x = jsonObj.payload;
它有效,但我得到以下异常:
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
有没有办法更改内容,以便我可以使用属性名称而不是作为关联数组访问动态对象中的反序列化内容,而不会出现异常?
我在RutimeBinderExceptions上找到了这个SO帖子:
跨 dll 边界访问匿名/动态类型的属性会生成 RuntimeBinderException
但我不想使用 ExpandoObject 类型,我什至不确定它是否适用于我的情况。
更新:好的,我相信我遇到了上面参考SO帖子中描述的问题。 调用的上下文是 Javascript 回调我的 C# 应用时来自 CefSharp 浏览器用户控件的回调。
尝试不使用 dynamic
数据类型:
Dictionary<string, object> theData= new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(jsonString);
string payload = (string)theData["payload"];
int number = (int)theData["number"];
string dialogResult = (string)theData["dialogResult"];
对 Deserialize() 的调用会创建一个字典树,您可以随意遍历该树。