在WinRT中使用动态数据类型反序列化JSON

时间:2012-11-24 14:06:27

标签: c# json dynamic windows-runtime json.net

我最近尝试使用动态数据类型的JSON.Net API反序列化JSON内容。

我非常努力地在论坛上搜索,发现在WinRT中确实可以这样做。

示例JSON可以是:

string json = "{\"message\":\"Sample Message\"}"

我使用以下格式:

dynamic result = JsonConvert.DeserializeObject<dynamic>(json);

它成功地将内容反序列化为结果。但是当我尝试使用如下语法访问它时:

string message = result.message;

导致错误:

  

'object'不包含'message'的定义,并且没有扩展方法'message'可以找到接受'object'类型的第一个参数(你是否缺少using指令或汇编引用?)

我尝试了互联网上的许多json样本,但错误仍然相同。 说实话,我在几个小时后尝试了它,它实际上工作了!但是这次我找不到我想念的东西。

PS:我只需要使用动态,因为我的实际Json包含动态字段名称。 一旦它像:

{"New York" : "Its in United States"}

有时它就像:

{"London" : "Its in United Kingdom"}

(虽然是废话!:P) 我想这里的json2csharp类方法不起作用,如果有一些二级和更有效的方法。请指导我。我想解析的真正的Json非常复杂。如果需要发布,我会发布它。

2 个答案:

答案 0 :(得分:3)

我在我的个人项目中使用JSON.NET,但是使用方括号语法反序列化,如下所示:

Id = jsonResult["object_id"].ToObject<int>(),

要实际获取JSON对象,我执行此操作:

var response = await client.GetStringAsync(parameters);
var jsonResult = JToken.Parse(response)["results"].Children();

在对使用JSON.NET的不同方法进行了大量研究之后,我采用了这种方法。在阅读本文之后,我认真考虑采用动态路线:http://www.west-wind.com/weblog/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing

然而,最后我决定不使用动态对象,因为当我使用方括号语法填充我的普通对象时,我立即返回强类型环境,其中intellisense将开始捕获我可能犯的任何错误。我将它与LINQ查询结合起来,并在相对较少的行中填充一组相当复杂的对象。

对我来说,动态对象是反序列化过程中的一个弱类型步骤,我希望尽可能避免这种步骤。

答案 1 :(得分:1)

我不确定你要做什么,但也许这会有所帮助:

[TestCase("{\"message\":\"Sample Message\"}", "Sample Message")]
[TestCase("{\"New York\" : \"Its in United States\"}", "Its in United States")]
[TestCase("{\"London\" : \"Its in United Kingdom\"}", "Its in United Kingdom")]
public void TestNameTest(string json, string expected)
{
    var result = JObject.Parse(json);
    var value = result.Values().Single();
    var jValue = new JValue(expected);
    Assert.AreEqual( jValue,value);
}