2013-04-12 31 views
2

我需要把這個beutifull默認JSON從服務棧:Costomising在服務棧序列化/序列化JSON

{ 
     "Status": "ok", 
     "LanguageArray": [{ 
     "Id": 1, 
     "Name": "English" 
     }, { 
     "Id": 2, 
     "Name": "Chinese" 
     }, { 
     "Id": 3, 
     "Name": "Portuguese" 
     }] 
    } 

爲了這個畸形的憎惡:

{"status":"ok","language":{ 
    "0":{"id":"1", "name":"English"}, 
    "1":{"id":"2", "name":"Chinese"}, 
    "2":{"id":"3", "name":"Portuguese"}, 
    } 

對於超出了我的控制或理由理性或邏輯。

我的問題是實現這個最簡單的方法是什麼? 我需要做到這一點幾乎所有的數組(它們是在C#中使用列表實現的IEnumerables)

回答

4

我不認爲我有一個'最簡單的方法',它取決於你需要序列化發生的地方以及如何嚴格的格式(區分大小寫?距離?)

如果把你的示例文本,並把它變成類這樣

public class Language 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class OuterLanguage 
{ 
    public string Status { get; set; } 
    public IEnumerable<Language> LanguageArray { get; set; } 
} 

一個非常簡單的方法將是具有DTO,增加了一個用於序列化數組的屬性並忽略原始數組。

public class OuterLanguageDto 
{ 
    public string Status { get; set; } 
    [IgnoreDataMember] 
    public IEnumerable<Language> LanguageArray { get; set; } 
    public IDictionary<string, Language> language 
    { 
     get { return this.LanguageArray.ToDictionary(x => (x.Id - 1).ToString()); } 
    } 
} 

當您需要序列化類(OuterLanguage)您使用TranslateTo(或您的首選映射),並轉移到DTO的值複製。

var jsonObj = obj.TranslateTo<OuterLanguageDto>(); 
var jsonStr = new JsonSerializer<OuterLanguageDto>().SerializeToString(jsonObj); 

您也可以查看Custom Serialization。這會讓你有一種方法將所有的數組序列化爲正確的格式。

JsConfig<IEnumerable<Language>>.SerializeFn = ToJson 

private string ToJson(IEnumerable<Language> arr) 
{ 
    var dict = arr.ToDictionary(x => x.Id - 1); 

    var str = JsonSerializer.SerializeToString<Dictionary<int, Language>>(dict); 

    return str; 
} 

不過,我猜你可能需要做一些「魔術字符串作品」把你的自定義序列化數組的JSON字符串並正確格式化時,外部類(OuterLanguage在這個例子中)是一個被序列化。

+0

謝謝你,我一直在閱讀服務棧文檔,找到這些信息,你爲我節省了很多時間。我找不到有關自定義的示例和更多詳細信息,以及如何在文檔中找到它。 – Arjang