2013-07-18 61 views
2

這是我在C#和JSON上的第一個小項目。有人問我解析一個JSON文件到以下幾點: 我試圖創建一個Windows形式,其體內會含有一個JSON字符串中的格式如下內容:使用JSON.NET將動態JSON字符串解析爲C#中的字符串

Name of the object 
(Label) name of the attribute of the object - (TextBox) editable value 
(Label) name of the attribute of the object - (TextBox) editable value 
... 

我有大約35個屬性json文件中的每個對象和8個對象。總共有大約50種不同的屬性。我搜索了JSON - C# - JSON.NET並閱讀了超過15個問題&的答案。對於像我這樣的初學者來說,答案有一些有價值的信息,但我無法將答案與我的情況聯繫起來。這些是原因:

  • 一些答案將JSON字符串轉換成C#對象。因爲我需要對象屬性的「名稱」,所以這個選項並不能解決我的問題。我不知道如何在源代碼中獲取變量的名稱並在Windows窗體中使用它。
  • 一些答案將json字符串轉換爲<Dictionary>數據結構。我沒有完全意識到字典及其屬性,但根據定義,我認爲,字典將兩個值相互映射。就我而言,3-5個不同的對象可能具有相同的屬性,因此對於一個屬性會有多個值。

除此之外,我見過一個例子是:

var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(json); var postalCode = dict["postalcode"];

因爲我身邊有50屬性,使用這種方法是不適合我的選擇:逐個使用字段名就像在這個例子中所做的那樣(「postalcode」是引用問題中的示例json對象中的一個屬性)。

乍一看,我想我可能會用我自己的字符串處理來解析它。但我想使用美麗的JSON.NET庫。我有點卡在這裏,不知道如何獲取json對象的屬性名稱,並在windows窗體中使用它的值。我腦海中有一些想法,但不知道如何實施它們。

我可能會將包含8個對象的json字符串解析爲對象數組,每個對象都包含二維字符串數組以獲取其屬性名稱和值。然後在編輯值時將字符串轉換爲浮點數。我需要它們作爲字符串,因爲我想在窗體中使用它們。這是我的解決方案。我該如何繼續?

回答

6

既然你有一個動態的JSON字符串,我建議解析字符串作爲JObject。這給了極大的靈活性,只要處理JSON對象樹:

var parseTree = JsonConvert.DeserializeObject<JObject>("{ a: 2, b: \"a string\", c: 1.75 }"); 
foreach (var prop in parseTree.Properties()) { 
    Console.WriteLine(prop.Name + ": " + prop.Value.ToObject<object>()); 
} 

另一個JObject例如:

var parsed = JsonConvert.DeserializeObject<JObject>("{\"name\":{\"a\":2, \"b\":\"a string\", \"c\":3 } }"); 
foreach (var property in parsed.Properties()) { 
    Console.WriteLine(property.Name); 
    foreach (var innerProperty in ((JObject)property.Value).Properties()) { 
     Console.WriteLine("\t{0}: {1}", innerProperty.Name, innerProperty.Value.ToObject<object>()); 
    } 
} 

如果你知道你正在處理一個JSON陣列,可以代替解析爲JArray和再看看每個JObject數組中:

var properties = JsonConvert.DeserializeObject<JArray>("[{a:1}, {b:2, c:3 }]") 
    .SelectMany(o => ((JObject)o).Properties()) 
    .ToArray(); 
foreach (var prop in properties) { 
    Console.WriteLine(prop.Name + ": " + prop.Value.ToObject<object>()); 
} 

爲了獲得更大的靈活性,您可以解析爲JToken

+0

我有一個對象名稱作爲json字符串開頭的字符串,json格式如下:'{\「name \」:{\「a \」:2,\「b \」:\ 「一個字符串\」,\「c \」:3}}' 這是否重要?由於我有一個額外的行相比你的JSON字符串,這是否意味着我必須做一些比你的答案更多? 而且這也是整個格式。我在json字符串中沒有任何對象。只浮動和一個字符串。 – Varaquilex

+0

@Volkanİlbeyli:我用你給的字符串添加了一個例子。額外的換行符不應該影響解析 – ChaseMedallion

+0

非常感謝。這真的有幫助。 – Varaquilex

1

對於那種動態的JSON,你可能想要考慮一些比JSON更麻煩的東西。NET,如SimpleJson(https://github.com/facebook-csharp-sdk/simple-json)。它只是一個.cs文件,可以複製/粘貼到您的項目中,也可以通過NuGet進行安裝。

它支持「動態」,非常易於使用。

舉例來說,如果你有一個JSON如:

{ 
    "inputs" : ["a", "b", "c"], 
    "outputs" : ["c", "d", "e"] 
} 

你可以分析它:

dynamic sys = SimpleJson.DeserializeObject(jsonString); 

,然後訪問一切通俗易懂:

foreach(var attr in sys) { 
    foreach(var name in attr) { 
     Console.WriteLine("In {0} with name: {1}", attr, name); 
    } 
} 

你可以的當然也可以通過名稱或索引訪問:

Console.WriteLine(sys["inputs"][0]); 

哪打印'a'。