2012-10-01 75 views
32

我想在C#中讀取Json字符串,但我很難搞清楚如何將字符串解析爲C#。說我有以下的JSON字符串在C#中解析Json字符串#

[ 
    { 
     "AppName": { 
      "Description": "Lorem ipsum dolor sit amet", 
      "Value": "1" 
     }, 
     "AnotherAppName": { 
      "Description": "consectetur adipisicing elit", 
      "Value": "String" 
     }, 
     "ThirdAppName": { 
      "Description": "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 
      "Value": "Text" 
     }, 
     "Application": { 
      "Description": "Ut enim ad minim veniam", 
      "Value": "100" 
     }, 
     "LastAppName": { 
      "Description": "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat", 
      "Value": "ZZZ" 
     } 
    } 
] 

我想解析到一個ArrayList或字典,使用格式一樣

descriptionList["AppName"] = "Lorem ipsum dolor sit amet"; 
valueList["AppName"] = "1"; 

我一直在玩弄Json.Net左右,但在我的例子已經見過,我不清楚我應該怎麼做。達到此目的的最佳方式是什麼?不能像jQuery一樣使用foreach語句來完成這項工作嗎?

+0

您可以用[DynamicJson(http://dynamicjson.codeplex.com/)編寫的C#對象的Json出字符串? – rt2800

回答

32

我在我的項目中使用Json.net和它的偉大工程。在你的情況下,你可以做到這一點來分析您的JSON:

編輯:我改變了代碼,以便它支持讀取您的JSON文件(陣列)

代碼解析:

void Main() 
{ 
    var json = System.IO.File.ReadAllText(@"d:\test.json"); 

    var objects = JArray.Parse(json); // parse as array 
    foreach(JObject root in objects) 
    { 
     foreach(KeyValuePair<String, JToken> app in root) 
     { 
      var appName = app.Key; 
      var description = (String)app.Value["Description"]; 
      var value = (String)app.Value["Value"]; 

      Console.WriteLine(appName); 
      Console.WriteLine(description); 
      Console.WriteLine(value); 
      Console.WriteLine("\n"); 
     } 
    } 
} 

輸出:

AppName 
Lorem ipsum dolor sit amet 
1 


AnotherAppName 
consectetur adipisicing elit 
String 


ThirdAppName 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua 
Text 


Application 
Ut enim ad minim veniam 
100 


LastAppName 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat 
ZZZ 

順便說一句,你可以使用LinqPad來測試你的代碼,不是建立在Visual Studio解決方案或項目容易餘噸hink。

+0

-1原始JSON是一種JArray不是JObject在你的答案 –

+0

@ L.B你說得對,這很着急。更新的代碼現在讀取數組。 –

+0

其實,第一個解決方案(在編輯之前)就是爲我工作的解決方案。 – desto

13

你可以嘗試System.Web.Script.Serialization.JavaScriptSerializer

var json = new JavaScriptSerializer(); 
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr); 
+0

它在System.Web.Script.Serialization中可用 – Guillaume86

+0

我真的不認爲這個序列化程序會與字典 –

+0

一起工作,它已經使用它編輯:只用@desto json測試我的代碼,工作正常:) – Guillaume86

1

而是一個ArrayList或字典,你也可以使用動態的。大多數情況下,我使用EasyHttp來做這件事,但肯定會有相同的其他項目。下面舉個例子:

var http = new HttpClient(); 
http.Request.Accept = HttpContentTypes.ApplicationJson; 
var response = http.Get("url"); 
var body = response.DynamicBody; 
Console.WriteLine("Name {0}", body.AppName.Description); 
Console.WriteLine("Name {0}", body.AppName.Value); 

上的NuGet:EasyHttp

1

你正在嘗試反序列化到一個字典實際上是序列化JSON JavaScript對象。在Javascript中,您可以將此對象用作關聯數組,但實際上它是一個對象,就JSON標準而言。

所以,如果將標準JSON序列化程序(如.net,DataContractJsonSerializer和JavascriptSerializer)與一個對象(名爲AppName,AnotherAppName等成員)反序列化,但實際將其解釋爲一個字典,你需要一個比Json規範更進一步的序列化程序,據我所知,它沒有關於字典的任何內容。

這樣的一個例子是一個大家使用:JSON .net

有一個其他的解決辦法,如果你不希望它以序列化JSON之前使用外部的lib,這是你的Javascript對象轉換爲列表。

var myList = []; 
$.each(myObj, function(key, value) { myList.push({Key:key, Value:value}) }); 

現在如果你序列化myList中的JSON對象,你應該能夠反序列化到List<KeyValuePair<string, ValueDescription>>與上述任何串行的。那麼這個列表將非常明顯地轉換爲字典。

注:值說明是這個類:

public class ValueDescription 
{ 
    public string Description { get; set; } 
    public string Value { get; set; } 
} 
12
json: 
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}] 

c#code:只取一個值,例如單詞「bike」。

//res=[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}] 

     dynamic stuff1 = Newtonsoft.Json.JsonConvert.DeserializeObject(res); 
     string Text = stuff1[0].hws[2]; 
     Console.WriteLine(Text); 

輸出:

bike