我最近尝试使用动态数据类型的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非常复杂。如果需要发布,我会发布它。
答案 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);
}