2013-08-30 52 views
0

我想創建一個類庫,允許我從列表中讀取數據,然後以json格式輸出數據。以下是客戶希望我效仿的json的屏幕截圖。我相信想使用json.net庫來創建這個json文件,但我正在爲如何創建我的c#類和集合而努力,以便獲得下面指定的輸出。用Newtonsoft重新創建Json文件

頂級對象被假定爲OEM對象,所以我期待在看到「7」,「8」,「27」,「49」,「16」的地方看到「OEM」。

舉例來說,如果我的OEM類的樣子:

public class OEM 
{ 
    public int OemID { get; set; } 

} 

和代碼來創建JSON是:

List<asbs.OEM> Oems = new List<asbs.OEM>(); 
    asbs.OEM oem = new asbs.OEM() { OemID = 7 }; 
    Oems.Add(oem); 

    string json = JsonConvert.SerializeObject(Oems, Formatting.Indented); 
    this._txt_Output.Text = json; 

輸出出來是這樣的:

[ 
    { 
    "OemID": 7 
    } 
] 

如何我可以得到名爲「7」而不是OemId的對象嗎? 這是可能的或者是json文件不利於創建通過使用像我的OEM對象可重用對象?

Desired json format

回答

0

的一種方式,讓您的OEM的ID與數字財產的名稱序列化是將它們放到一個字典和序列化,而不是Oems列表。這裏是你如何能做到這一點很容易:

// Original list of OEM objects 
List<asbs.OEM> Oems = new List<asbs.OEM>(); 
Oems.Add(new asbs.OEM() { OemID = 7 }); 
Oems.Add(new asbs.OEM() { OemID = 8 }); 
Oems.Add(new asbs.OEM() { OemID = 27 }); 

// Create a new dictionary from the list, using the OemIDs as keys 
Dictionary<int, asbs.OEM> dict = Oems.ToDictionary(o => o.OemID); 

// Now serialize the dictionary 
string json = JsonConvert.SerializeObject(dict, Formatting.Indented); 

您可能還需要與[JsonIgnore]屬性來裝飾OEMID屬性,使其不會在串行化輸出的其他地方包括(除非你希望它在那裏)。

對於其他屬性,如果它們在類中的命名與您希望序列化輸出的名稱不同,則可以使用[JsonProperty]屬性控制該屬性。

public class OEM 
{ 
    [JsonIgnore] 
    public int OemID { get; set; } 

    [JsonProperty(PropertyName="cars")] 
    public CarInfo Cars { get; set; } 

    [JsonProperty(PropertyName = "suvs")] 
    public CarInfo Suvs { get; set; } 

    // other properties 
} 

這應該足以讓你開始。如果你需要更多的輸出控制權,你可以考慮爲你的OEM類創建一個自定義的JsonConverter

1

那是因爲你有對象的列表或數組。你提供的JSON只是一個包含嵌套對象的對象。基本上作爲一個經驗法則;

只要看到「PROPERTYNAME」:{...}需要和對象在C#代碼 只要看到「PROPERTYNAME」:[...]則需要一個List<T>T[](陣列)的封閉式的。您將不得不編寫自定義序列化程序,因爲整數在C#中不是有效的屬性名稱,並且示例json中的一些對象的名稱類似於「7」。

所以要爲你做一點點,你需要這樣的東西;

public class jsonWrapper 
{ 
    public Seven seven { get; set; } 
} 

public class Seven 
{ 
    public All all { get; set; } 
} 

public class All 
{ 
    public Cars cars { get; set; } 
} 

public class Cars 
{ 
    public Portrait Portrait { get; set; } 
} 

public class Portrait 
{ 
    public Landscape Landscape { get; set; } 
} 

public class Landscape 
{ 
    public Background Background { get; set; } 
} 

public class Background 
{ 
    public Element[] Elements { get; set; } // the only array I see in your json 
} 

public class Element 
{ 
    //properties that you have collapsed 
}