【问题标题】:Newtonsoft deserialize Array to class with properties [duplicate]Newtonsoft 将数组反序列化为具有属性的类[重复]
【发布时间】:2020-07-14 07:35:39
【问题描述】:

使用外部服务,他们决定将对象作为数组提供,其中每个属性都位于固定位置。喜欢

{
    "persons" : [
        ["Luck", "Lucky", 28],
        ["Joe", "Dalton", 30],
        ["Jack", "Dalton", 28],
        ["William", "Dalton", 26],
        ["Averell", "Dalton", 24]
    ]
}

我想将其反序列化为人员列表。

var persons =  JsonConvert.DeserializeObject<Person[]>(json);

class Person {
      public string FirstName {get; set; }
      public string LastName {get; set; }
      public int Age{get; set; }
}

是否有一种简单的方法(属性注释)可以做到这一点,或者是否可以编写自定义序列化程序?

由于大多数答案都缺少问题的本质。

如果

  {
    "persons" : [
        { 
             "FirstName" :  "Luck", 
             "LastName" : "Lucky", 
             "Age" : 28 
        },
        // ...
    ]
}

但事实并非如此。

【问题讨论】:

  • 我认为您错误地复制了您的示例,因为它不是有效的 JSON(人员必须是“人员”)。

标签: c# json json.net


【解决方案1】:

persons 属性是字符串数组的数组。先尝试反序列化为List&lt;List&lt;string&gt;&gt;

public class Root
{
    public List<List<string>> persons { get; set; }
}

然后使用Select 方法将其转换为List&lt;Person&gt; 列表

var root = JsonConvert.DeserializeObject<Root>(jsonString);
var persons = root.persons
    .Select(l => new Person { FirstName = l[0], LastName = l[1], Age = int.Parse(l[2]) })
    .ToList();

【讨论】:

  • root 不会是 Person 数组,因此无法回答问题。
  • @StijnVanAntwerpen 我添加了一个 linq 调用以获取 Person 类的列表
  • 嗯,您可以按原样反序列化它,然后将其映射到 Person。不是问题,但可能是一个很好的解决方案。
【解决方案2】:

您应该创建一个自定义 json 反序列化器。

试试这个:

public class PersonJsonConverter : JsonConverter
{
    public class RootJson
    {
        public List<List<string>> Persons { get; set; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jsonObject = JObject.Load(reader);
        var root = JsonConvert.DeserializeObject<RootJson>(jsonObject.Root.ToString());

        var persons = root.Persons
            .Select(p => new Person { FirstName = p[0], LastName = p[1], Age = int.Parse(p[2]) })
            .ToList();

        return persons;
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}

你可以像这样反序列化:

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public int Age { get; set; }
}

 var deserializedRoot = JsonConvert.DeserializeObject<List<Person>>(yourJson, new PersonJsonConverter());

【讨论】:

    【解决方案3】:

    你可以很容易地做到这一点:

    PersonList personObject = new PersonList();
    
    
    public class PersonList
    {
        public List<Person> persons { get; set; }
    }
    
    public class Person
    {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string Age{ get; set; }
    }
    
    personObject  = JsonConvert.DeserializeObject<PersonList>(YourResponseContent);
    

    然后personObject 项目将具有响应的值。

    MainList 必须与响应中的项目名称相同。这对于阅读JSON 响应很重要。

    【讨论】:

    • 将失败,无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“Person”,因为该类型需要 JSON 对象(例如 {"name":"value"} ) 以正确反序列化。
    • 很好的解决方案,投赞成票:-)
    【解决方案4】:

    你可以Deserialize list of objects in C#

    var results=JsonConvert.DeserializeObject<List<Person>>(json);
    

    【讨论】:

      【解决方案5】:

      怎么样

      public class Root
      {
          public List<List<Object>> persons { get; set; }
      
      }
      

      Root dsz = JsonConvert.DeserializeObject<Root>(sz);
      

      它将被反序列化为每个人将拥有变量列表的人员列表。

      persons[0][0] = "Luck"
      

      【讨论】:

        【解决方案6】:

        如果我正确理解了您的问题,您可以这样做:

        public class PersonObj
        {
            public List<Person> persons {get;set;}
            public string FirstName { get { return persons.First(); }
            public string LastName { get { return return persons.Skip(1).First(); } }
        }
        

        【讨论】:

          【解决方案7】:
          class ParsedList
              {
                  public List<List<object>> persons { get; set; }
              }
              class Person
              {
                  public string FirstName { get; set; }
                  public string LastName { get; set; }
                  public int Age { get; set; }
              }
          

          文本是你的 JSON:

          ParsedList list = Newtonsoft.Json.JsonConvert.DeserializeObject<ParsedList>(text);
          
                      List<Person> people = list.persons.Select(x => new Person()
          
                      {
                          FirstName = x[0].ToString(),
                          LastName = x[1].ToString(),
                          Age = Convert.ToInt32(x[2])
                      }
                      
                      ).ToList();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-26
            相关资源
            最近更新 更多