2

我需要从 Service Stack 转换这个漂亮的默认 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# 中的 List 实现的 IEnumerables)

4

1 回答 1

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(或您首选的 Mapper)并将值复制到 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)是被序列化的类时正确格式化它。

于 2013-04-12T21:22:16.540 回答