针对 ARM 的 C#:如何反序列化 JSON?

C# targetting ARM: How to deserialize JSON?

我正在为 Windows 10 IoT 编写我的第一个 C# 应用程序。我的一切正常,我的网络请求等,我能够检索我想要的内容以呈现给用户。但是...它在 JSON 中,我无法将其视为常规变量,因此我只能选择一个 属性.

JSON Result
{  
   "date":"2017-07-09",
   "period":"year",
   "views":970347,
   "visitors":150013,
   "likes":136,
   "reblogs":13,
   "comments":1099,
   "followers":145
}

我尝试为 NewtonSoft JSON (JSON.NET) 添加 Nuget 包,但这似乎在 rPI 的 ARM CPU 上不起作用。所以我开始使用 Windows.Data.JSON.JsonObject class 来代替。

我在这一行中使用 JSonObject.Parse() 解析我的应用程序的 JSON 响应,然后在调试时,我看到以下内容。

JsonObject meme = JsonObject.Parse(ResponseContent);

我可以在 meme 下看到我想要的所有值。 JSonObject 提供了 GetNamedString()GetNamedObject() 方法,但我都收到了终止错误:{"A method was called at an unexpected time.\r\n\r\nThis is not a string value. Use ValueType property to get the type."}

我来自 PowerShell,我只是将响应转储到 $response 中并取出 key/value 与 $Response.Views 对,但我不知道这是怎么回事应该在 c# 中工作。我真正不明白的是为什么它在解析后似乎停留在 JSON 中。

我的目标是将 JSON 的关注者和访客结果分配给一个变量,以便我以后可以引用它们。 webrequest 有效...我似乎无法让 JSON 解析。

Watch 视图上的 JSON 实际上只是为了显示,但它已经在 Type 列中显示的类型 JsonObject 中。

是说该方法将不起作用,因为您尝试提取的类型无法由 GetNamedString()GetNamedObject() 处理。你也应该有一个 GetNamedValue() 方法来处理这个数字:

meme.GetNamedValue("views").GetNumber()

你也可以像这样通过索引访问值:

meme["views"].GetNumber()

如果您想确保在返回的 JSON 值方面它不会在边缘情况下失败,您可以使用 meme["whateverJSONkey"].ValueType 属性 和 switch/case以防止异常

我不知道为什么 JSON.NET 不起作用,但下面的编译和执行都很好(为简洁起见省略了异步性):

string s = @"{  
  ""date"":""2017-07-09"",
  ""period"":""year"",
  ""views"":970347,
  ""visitors"":150013,
  ""likes"":136,
  ""reblogs"":13,
  ""comments"":1099,
  ""followers"":145
}";

JsonObject data = null;
if (!JsonObject.TryParse(s, out data))
  new MessageDialog("Not valid JSON").ShowAsync();

var followers = data["followers"].GetNumber();
var visitors = data["visitors"].GetNumber();

new MessageDialog(String.Format("You had {0} visitors and {1} followers",
  visitors, followers)).ShowAsync();