2012-11-24 38 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

謝謝。確實有幫助。 :) –