【问题标题】:json_serializer.DeserializeObject, immediate window, VS2017json_serializer.DeserializeObject,即时窗口,VS2017
【发布时间】:2019-03-01 15:21:46
【问题描述】:

我是一名 c# 初学者(但对 JavaScript 非常熟悉),我正在通过调试示例代码来学习。我现在有一个关于“立即窗口”的问题。

我设置了一个断点

  (... nested object sent via JSON from some external javascript code ...)
var json_serializer = new JavaScriptSerializer();
var value_list = (IDictionary<string, object>)json_serializer.DeserializeObject(value);

然后在即时窗口中评估以下内容

value_list
Count = 4
    [0]: {[type, msg]}
    [1]: {[settings, System.Collections.Generic.Dictionary`2[System.String,System.Object]]}
    [2]: {[hello, edge]}
    [3]: {[txt, notepad.exe]}

value_list["txt"]
"notepad.exe"


value_list["settings"]
Count = 2
    [0]: {[host, test.com]}
    [1]: {[port, 80]}

到目前为止一切顺利。

然后我尝试了

value_list["settings"]["host"]

但只收到“错误 CS0021:无法使用 [] 将索引应用于“对象”类型的表达式”。

如何在即时窗口中打印主机的值?

【问题讨论】:

  • 如果您只是在学习,请放弃并忘记课程 JavaScriptSerializer 曾经存在过。使用 NewtonSoft.Json 包,它已经是很长时间的标准了
  • 是的,JsonConvert 更好
  • JavascriptSerializer 是一个过时的类,早在 AJAX 首次出现时就引入了。自 ASP.NET Web API 以来的每个堆栈都使用 JSON.NET,即 NewtonSoft.Json。只是不要使用 JavascriptSerializer
  • 已注意到(我已经在 Microsoft 的 API 文档中看到了相同的建议)。

标签: c# javascriptserializer immediate-window


【解决方案1】:

C# 是一种强类型语言。

你有

var value_list = (IDictionary<string, object>)json_serializer.DeserializeObject(value);

var 表示变量的类型已经在编译时由编译器确定。由于右侧的强制转换,编译器确定:

IDictionary<string, object> value_list = (IDictionary<string, object>)json_serializer.DeserializeObject(value);

所以,value_list 的类型是 IDictionary&lt;string, object&gt;。所以,value_list["settings"] 的类型是 object

要查看即时窗口中的值,将中间结果(object 类型)转换为适当的类型。

((IDictionary<string, object>)value_list["settings"])["host"]

【讨论】:

  • #1 有效。谢谢! #2 不起作用错误 CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' 虽然已经添加了参考。但这应该是单独的问题。我只是想指出#1 似乎是“更简单”的解决方案。
  • @cscharf 是的,我已经从答案中删除了第二个建议。在即时窗口中使用dynamic 仅适用于实际项目源中已经使用dynamic 的项目(除非非常特殊的情况,否则不应这样做)。
  • 知道了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2017-10-17
  • 2010-11-09
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
相关资源
最近更新 更多