2013-08-21 44 views
0

我使用JavaScriptSerializer()中構建的.Net來序列化來自網頁的JSON字符串。 我聽說Newtonsoft.Json.Net有更好的序列化器,所以我想我會試試看。Json.Net用於序列化對象圖

我加載我的json字符串,這裏是一個示例。

jsonString = "{\"jName\":\"MB-CEF3-4\",\"StartDate\":\"08/20/2013 00:00\",\"EndDate\":\"08/29/2013 00:00\",\"JType\":\"General\",\"SetupParams\":[ 
{\"Name\":\"PTitle\",\"Title\":\"01. Period Title\",\"Type\":\"text\",\"Value\":\"TestName\"}, 
{\"Name\":\"PStart\",\"Title\":\"02. Period Start\",\"Type\":\"datetime\",\"Value\":\"08/20/2013\"}, 
{\"Name\":\"Target\",\"Title\":\"03. Target\",\"Type\":\"int\",\"Value\":\"1\"}, 
{\"Name\":\"URL\",\"Title\":\"04. Completion Report URL\",\"Type\":\"url\",\"Value\":\"http://www.example.com\"}, 
{\"Name\":\"FormTitle\",\"Title\":\"05. Form Title\",\"Type\":\"text\",\"Value\":\"ct\"}, 
{\"Name\":\"nvTypes\",\"Title\":\"{B6E71787-EB51-45CF-B408-552F79AF2E7B}\",\"Type\":\"nvc\",\"Value\":\"Use of nv tools\"},  {\"Name\":\"NVCoachingTypes\",\"Title\":\"\",\"Type\":\"nvc\",\"Value\":\"\"}]}"; 

JavaScriptSerializer scs = new JavaScriptSerializer(); 
     Dictionary<String, Object> aps = (Dictionary<String, Object>)scs.DeserializeObject(ActSetupConfigs); 

然後我會通過這個字典到另一個工人類,它被反序列化..

我使用的:var參數=((對象[])參數[ 「SetupParams」]);它將加載一個對象數組。

我試圖做同樣的Json.Net

Dictionary<String, Object> aps = JsonConvert.DeserializeObject<Dictionary<String, Object>>(ActSetupConfigs); 

,但是當我嘗試反序列化我沒有得到對象的數組,而不是數組的子集只是一個字符串。 ...所以它會拋出一個異常。我如何使用Json.net序列化所有子集合?

+0

Theres一個偉大的在線工具來檢查有效的JSON。把你的序列化的json運行到這裏,它會給你一個想法,看你的JSON格式是否正確。 http://jsonviewer.stack.hu/ –

回答

0

SetupParams數組的子集合不是一個字符串,它是一個JToken,它是JSON.Net用來存放JSON結構的通用容器對象。幸運的是,從JToken中提取值很容易。請嘗試使用此代碼。

JToken aps = JToken.Parse(jsonString); 

foreach (JToken param in aps["SetupParams"]) 
{ 
    Console.WriteLine("Name: " + param["Name"].Value<string>()); 
    Console.WriteLine("Title: " + param["Title"].Value<string>()); 
    Console.WriteLine("Type: " + param["Type"].Value<string>()); 
    Console.WriteLine("Value: " + param["Value"].Value<string>()); 
    Console.WriteLine(); 
} 
+0

格式可以改變....它的動態...所以我不想編寫定義一切的類 – matthewbaskey

+0

用另一種方法更新了我的答案。 –

+0

是的,我只是將這個團隊轉移到了Json.Net序列化中,而沒有將現有的代碼改變得太多。在一天結束時,通常Dictionary中的所有對象都是字符串,但在某些情況下,可以將xml文件發佈爲文件。 – matthewbaskey

0

您可以分析使用json.net像上面的JSON響應,

dynamic initialresp=JValue.Parse(jsonString); 
string jname=Convert.ToString(initialresp.jname); 
... 
... 
dynamic setupparams=JArray.Parse(Convert.ToString(initialresp.SetupParams)); 
foreach(var item in setupparams) 
{ 
string name=Convert.Tostring(item.Name); 
string title=Convert.Tostring(item.Title); 
... 
... 
} 

希望這有助於。

相關問題