1

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

我真的很努力地搜索了论坛,发现在WinRT中确实可以这样做。

示例 JSON 可以是:

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

我使用了以下格式:

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

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

string message = result.message;

它会导致一个错误,即:

“object”不包含“message”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“message”(您是否缺少 using 指令或程序集引用?)

我在互联网上尝试了许多 json 样本,但错误仍然相同。说真的,几个小时前我试过了,它确实有效!但是这次我找不到我缺少的东西。

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

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

有时就像:

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

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

4

2 回答 2

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

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

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

于 2012-11-24T14:20:20.160 回答
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);
}
于 2012-11-24T14:18:50.030 回答