将JSON对象反序列化为动态类型但是获取RuntimeBinderException访问属性?

时间:2015-02-03 19:28:39

标签: c# dynamic json.net json-deserialization

我在C#Windows窗体应用程序中使用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帖子:

Accessing properties of anonymous/dynamic types across dll boundaries gives RuntimeBinderException

但我不想使用ExpandoObject类型,我甚至不确定它是否适用于我的情况。

更新:好的,我相信我遇到了上面参考SO帖子中描述的问题。当Javascript回调到我的C#应用​​程序时,调用的上下文是来自CefSharp浏览器用户控件的回调。

1 个答案:

答案 0 :(得分:3)

尝试在没有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()的调用会创建一个Dictionary树,您可以随意遍历。