2012-11-24 37 views
1

我最近试图使用带有动态数据类型的JSON.Net API反序列化JSON内容。在WinRT中使用动态数据类型反序列化JSON

我真的很难搜索论坛,并发现在WinRT中确实有这样做的可能。

样品JSON可以是:

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

我使用以下格式:

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

它成功地解串以导致该内容。但是,当我尝试使用一个语法像访问它:

string message = result.message; 

它导致这是一个错误:

“对象”不包含“信息”,并没有扩展方法“的定义。消息“接受类型'对象'的第一个参数可以找到(你是否缺少一个使用指令或程序集引用?)

我尝试了很多json样品,但错误仍然是一样的。 真正地说,我试了几个小时后,它实际上工作!但是这次我找不到我缺少的东西。

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

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

,有时是这样的:

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

(废话例如,虽然:P) 的json2csharp类方法不会在这里工作,我想,如果有一些次要和更有效的方法。请引导我。我试图解析的真正的Json非常复杂。如果需要发布,我会发布它。

回答

3

我用JSON.NET在我的个人项目,但用方括号的语法像这样反序列化:

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

实际得到的JSON对象我这样做:

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

我采用了这种methodolog在对使用JSON.NET的不同方式进行了一些研究之后。我认真地考虑过在看完这篇文章之后走动态路线:http://www.west-wind.com/weblog/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing

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

对我来说,动态对象是反序列化过程中的一个更弱的类型步骤,如果可能,我宁愿避免。

+1

嗨,谢谢。这件事对我来说非常出色,而且现在也不需要任何动态对象。我同意你所说的弃用动态对象的原因。再次感谢。 :) –

+0

快乐!很高兴我能帮上忙。我自己花了很多时间在这个上! –

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); 
} 
+0

谢谢。确实有帮助。 :) –