JArray到c#Object

时间:2018-05-24 12:37:58

标签: c# json json.net

我有这个json字符串:

[
   {
      "id":"EORDERING_GRE017",
      "name":"DELIMITER",
      "value":"|"
   },
   {
      "id":"EORDERING_GRE017",
      "name":"ENABLED",
      "value":"Y"
   },
   {
      "id":"EORDERING_GRE017",
      "name":"EXTERNALERRORRECIPIENT",
      "value":"jaymie@moo.co.uk; matt@moo.co.uk"
   },
   {
      "id":"EORDERING_GRE017",
      "name":"FILETYPE",
      "value":"delimited"
   },
   {
      "id":"EORDERING_GRE017",
      "name":"INTERNALERRORRECIPIENT",
      "value":"jaymie@moo.co.uk; matt@moo.co.uk"
   },
   {
      "id":"EORDERING_GRE017",
      "name":"USESOWNBRANCHCODES",
      "value":"True"
   },
   {
      "id":"EORDERING_GRE017",
      "name":"USESOWNSKUS",
      "value":"True"
   }
]

我想把那个json变成我的班级,看起来像这样:

public class Settings
{
    public bool Enabled { get; set; }
    public string FileType { get; set; }
    public string Delimiter { get; set; }
    public string OrderFileSuffix { get; set; }
    public string ResultFileSuffix { get; set; }
    public bool UseOwnBranchCodes { get; set; }
    public bool UseOwnProductCodes { get; set; }
    public string InternalContacts { get; set; }
    public string ExternalContacts { get; set; }
}

但我不确定哪种方法最好。有人可以帮我一把吗? :)

3 个答案:

答案 0 :(得分:3)

您可以创建一个NameValue对象:

public class NameValuePair
{
   public string Name { get; set; }
   public string Value { get; set; }
}

将json数组反序列化为List并将其转换为Dictionary:

var dict = JsonConvert.DeserializeObject<List<NameValuePair>>(json).ToDictionary(x => x.Name, x => x.Value);

然后使用接受此字典并返回Settings对象的方法创建自定义转换器类:

public class SettingsConverter
{
    public Settings Convert(IDictionary<string, string> data)
    {
        return new Settings
        {
            Enabled = data["ENABLED"].Equals("Y", StringComparison.Ordinal),
            ...
        };
    }
}

答案 1 :(得分:2)

JSON是一个适合这个类的对象数组:

public class Setting
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

所以反序列化:

var settingList = JsonConvert.DeserializeObject<Setting[]>(jsonString);

但是,您希望将特定设置映射到该Settings类的特定属性。您可以通过尝试在设置列表中找到每个属性的特定设置来执行此操作:

var settingsObject = new Settings
{
    FileType = settingList.FirstOrDefault(s => s.Name == "FILETYPE")?.Value,
    Delimiter = settingList.FirstOrDefault(s => s.Name == "DELIMITER")?.Value,
    // ...
}

手动映射属性。如果您不想这样,您可以编写自定义序列化程序,但这很快就会成为维护的噩梦。

答案 2 :(得分:0)

对于那些可能需要更多JSON类配置帮助的人,请尝试:http://json2csharp.com/#

自动生成类的一种很好的方法!

甚至更容易,在VS中,转到:

  

编辑 - &gt;选择性粘贴 - &gt;粘贴为JSON类