2017-07-04 73 views
2

我有如下一個非常簡單的方法,自定義類:如何創建從JSON字符串,而無需創建使用JSON.Net庫

//my current file 
using Newtonsoft.Json; 
string key1 = "FirstKey"; 
string key2 = "SecondKey"; 
string key3 = "ThirdKey"; 
private string CreateJson(string val1, string val2, string val3,string val4, string val5, string val6) 
{ 
    //process the six arguments and three key-related member variables to create a JSON array 
    //don't want to use JsonConvert.SerializeObject the way I'm doing below as it requires creating a class 

    var configs = new List<CustomClass> 
         { new CustomClass{ FirstKey = val1,SecondKey= val2,ThirdKey= val3} 
          , new CustomClass{ FirstKey= val4,SecondKey= val5,ThirdKey = val6} 
         }; 
    var jsonData = JsonConvert.SerializeObject(configs); 
    return jsonData; 
} 

//A class in another file 
public class CustomClass 
{ 
    public string FirstKey { get; set; } 
    public string SecondKey{ get; set; } 
    public string ThirdKey{ get; set; } 

} 

我試圖創建一個使用JSON.Net JSON數組。預期輸出如下:

[{"FirstKey":val1,"SecondKey":val2,"ThirdKey":val3} 
, {"FirstKey":val4,"SecondKey":val5,"ThirdKey":val6}] 

這裏val1val6值應在運行時的參數值被替換。最初,由於只有三種類型的字符串鍵值對,所以我認爲創建JSON字符串非常簡單,只需使用字符串文字並以JSON格式一個接一個追加。但很快我偶然發現了可以使JSON字符串變形的逃逸字符的世界,例如\r

我以前一直在使用JSON.Net庫,只是簡單地使用JSONConvert類對對象進行序列化和反序列化,而我從來不關心並完全不知道JSON.Net庫對逃逸字符的處理方式。保持JSON字符串有效。

反正,回到我的問題。我能夠通過創建具有三個屬性FirstKey,SecondKeyThirdKey的自定義類來解決我的問題。然後,創建該類的對象,然後分配參數val1val2中的值,然後使用JsonConvert.SerializeObject API。

我想要一個非常簡單的方式,使用JSON.Net NuGet包創建JSON字符串,而不涉及自定義類。在這裏創建一個類CustomClass總是感覺像一個開銷。我正在尋找類似於StringBuilder.Append API的東西,如果它在我正在使用的JSON庫中可用的話。我不確定是否缺少JSON.Net中的任何API。

+0

已經有答案了,比如[so1](https://stackoverflow.com/questions/21021655/json-serialize-listkeyvaluepairstring-object),[so2](https://stackoverflow.com/questions/ 5124889/serialize-net-dictionarystring-string-into-json-key-value-pair-object) –

+1

將值選擇爲匿名類型,然後對其進行序列化。 – stuartd

+0

@stuartd,因爲我需要一個JSON數組作爲我的最終輸出,所以我將不得不創建一個'List '。我如何定義'List '變量? – RBT

回答

6

正如評論中提到的那樣,您可以使用匿名對象輕鬆創建它。

private string CreateJson(string val1, string val2, string val3, string val4, string val5, string val6) { 

    var configs = new[] 
    { 
     new { FirstKey = val1, SecondKey = val2, ThirdKey = val3}, 
     new { FirstKey = val4, SecondKey = val5, ThirdKey = val6} 
    }; 

    var jsonData = JsonConvert.SerializeObject(configs); 

    return jsonData; 
} 
+2

你甚至可以使用'JObject.FromObject'! – code4life

+0

@code4life儘管Nkosi的解決方案非常簡單,我在尋找的東西,但我仍然試圖用'JObject.FromObject'完成它,但是我得到了'System.ArgumentException'異常,說'Object serialized to Array。 JObject實例預計.'。如果可能的話,你可以幫助我使用'JObject.FromObject'實現相同的最小代碼片段嗎? – RBT

+1

我懂了@ code4life。實際上它是'JArray.FromObject' API。 – RBT

1

充分利用在接受的答案@code4life的評論一些線索,我意識到,這是通過在Newtonsoft.Json.Linq命名空間以及發現JArray對象實現的。所以,我想建立另一個答案是提供一種替代的情況下,它可以幫助別人的:

using Newtonsoft.Json.Linq; 

private string CreateJson(string val1, string val2, string val3, string val4, string val5, string val6) 
{ 

    var configs = new[] 
    { 
     new { FirstKey = val1, SecondKey = val2, ThirdKey = val3}, 
     new { FirstKey = val4, SecondKey = val5, ThirdKey = val6} 
    }; 

    return JArray.FromObject(configs).ToString(); 
} 

注意:它正在通過new { FirstKey = val1, SecondKey = val2, ThirdKey = val3}語法創建可以很好地包含任何.NET數據類型爲此事匿名類型而不僅僅是我在原始文章中提到的字符串new { FirstKey = "AnyString", SecondKey = true, ThirdKey = DateTime.Now}