【发布时间】:2016-03-10 11:57:48
【问题描述】:
我使用 Json.net 将 json 字符串反序列化为动态对象:
var initialJSON = "{ 'artillery': { 'status': '0', 'code': '' }, 'diplomacy': { 'status': '0', 'code': '' }, 'seccheck': { 'status': '0', 'code': '' }, 'march': { 'status': '0', 'code': '' }, 'production': { 'status': '0', 'code': '' }, 'water': { 'status': '0', 'code': '' }, 'technology': { 'status': '0', 'code': '' }, 'spy': { 'status': '0', 'code': '' }, 'weapon': { 'status': '1', 'code': '' }, 'raid': { 'status': '0', 'code': '' }, 'prod_artillery': { 'status': '1', 'code': '' }, 'prod_bio': { 'status': '1', 'code': '' }, 'prod_nuclear': { 'status': '1', 'code': '' }, 'prod_hacking': { 'status': '1', 'code': '' }, 'prod_covops': { 'status': '1', 'code': '' }, 'prod_tank': { 'status': '1', 'code': '' }, 'prod_infantry': { 'status': '1', 'code': '' }, 'prod_fighter': { 'status': '1', 'code': '' }, 'prod_ship': { 'status': '1', 'code': '' }, 'prod_submarine': { 'status': '1', 'code': '' }, 'prod_general': { 'status': '1', 'code': '' }, 'weapon_bio': { 'status': '1', 'code': '' }, 'weapon_nuclear': { 'status': '1', 'code': '' }, 'weapon_covops': { 'status': '1', 'code': '' }, 'weapon_hacking': { 'status': '1', 'code': '' } }";
var actionData = JsonConvert.DeserializeObject<dynamic>(initialJSON);
我正在与一位同事开展团队基础服务器项目。 反序列化后,我可以访问如下属性:
actionData.production.status = "1";
但是当我的同事运行同一行代码时,他得到了一个 RuntimeBinderException:
“actionData.production”抛出了一个类型为“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”动态的异常
'Newtonsoft.Json.Linq.JObject' 不包含对 '生产'
比较时我们注意到他没有在 actionData 上获得“动态视图”:
我的观点:
他的观点:
这怎么可能?
我们比较了我们的调试器/异常设置,它们是 100% 相等的。 VS 版本相同,TFS 等项目版本相同。
我绝对知道我可以避免动态并使用真实的对象。
但我非常好奇这种差异可能来自哪里。
【问题讨论】:
-
您使用的是相同版本的 Json.NET 吗?你可以通过
Debug.WriteLine("Json.NET version: " + typeof(JToken).Assembly.FullName);看到。 -
我们的版本相同(7.0.0.0)
标签: c# linq visual-studio dynamic json.net