针对 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();
我正在为 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();