【问题标题】:c# Converting json string with list of objects to a c# objectc#将带有对象列表的json字符串转换为c#对象
【发布时间】:2018-03-27 11:02:55
【问题描述】:

我正在尝试将字符串 json 转换为 c# 对象,

我已经在这里阅读了几个关于类似问题的回复,但没有一个解决方案有效。

这是 json 对象

{
   "Customer": {
     "data_0": {
        "id": "273714",
        "FirstName": "Zuzana",
        "LastName": "Martinkova"
     },
     "data_1": {
        "id": "274581",
        "FirstName": "Ricardo",
        "LastName": "Lambrechts"
     },
     "data_2": {
        "id": "275190",
        "FirstName": "Daniel",
        "LastName": "Mojapelo"
     },
     "data_3": {
        "id": "278031",
        "FirstName": "Sulochana",
        "LastName": "Chandran"
      }
   }
}

我根据json obj创建了以下对象

public class Customer
{
    public List<Data> Customers{ get; set; }
    public Customer()
    {
        Customers = new List<Data>();
    }
}
public class Data
{
    public string id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

至于我的代码,我制作了一个小型控制台应用程序示例,其中包含我在这里找到的所有独奏

static void Main(string[] args)
{
    try
    {
        string jsonString = File.ReadAllText(ConfigurationSettings.AppSettings["filepath"].ToString());

        //solution 1
        JObject jsonone = JObject.Parse(jsonString);
        var collection_one = jsonone.ToObject<Customer>();

        //solution 2
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        var collection_two = serializer.Deserialize<Customer>(jsonString);

        //solution 2
        var collection_three = JsonConvert.DeserializeObject<Customer> (jsonString);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message); ;
    }

    Console.ReadKey();
}

我从第 3 方网络服务获得的 json 字符串,因此仅举个例子,我正在从 txt 文件中读取 json,
读取后的jsonString参数值为:

"{\"Customer\":{\"data_0\":{\"id\":\"273714\",\"FirstName\":\"Zuzana\",\"LastName\":\"Martinkova\"},\"data_1\":{\"id\":\"274581\",\"FirstName\":\"Ricardo\",\"LastName\":\"Lambrechts\"},\"data_2\":{\"id\":\"275190\",\"FirstName\":\"Daniel\",\"LastName\":\"Mojapelo\"},\"data_3\":{\"id\":\"278031\",\"FirstName\":\"Sulochana\",\"LastName\":\"Chandran\"}}}"

在我使集合计数为 0 的每个解决方案中,数据对象不包括在列表中。

谁能解释一下,告诉我哪里出了问题?
在此先感谢

【问题讨论】:

  • 你需要两个类,保留你的Data 类,你需要另一个类,它有一个名为“Customer”的Dictionary&lt;string, Data&gt; 属性。如果您想拥有不同的 C# 属性名称,那么您需要使用 JSON.NET [JsonProperty(name="")] 属性的 JSON
  • @maccettura 但我有 2 个课程,1 个用于 data,2 个有 list&lt;data&gt;
  • 你的 JSON 不是一个列表,它是一个字典。您的属性称为“客户”,您的 JSON 明确标记为“客户”
  • 您没有任何名为Data 的对象,您有一个data_01 和一个data_02,等等,所以,就像@maccettura 所说,您没有@ 列表987654333@,你有一个Dictionary&lt;string, Data&gt;
  • @maccettura 您的解决方案解决了它,我没有意识到字典会有所不同。谢谢

标签: c# json


【解决方案1】:

您的 JSON 是 Dictionary&lt;string, Data&gt;不是 List&lt;Data&gt;。除此之外,您的财产被称为“客户”,而不是“客户”。要解决这个问题,您需要更改几件事:

public class Customer
{
    //JsonProperty is Used to serialize as a different property then your property name
    [JsonProperty(PropertyName = "Customer")] 
    public Dictionary<string, Data> CustomerDictionary { get; set; }
}
public class Data
{
    public string Id { get; set; } //You should make this "Id" not "id"
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

通过这些类定义,您可以轻松使用JsonConvert.DeserializeObject()JsonConvert.SerializeObject() 方法:

Customer customer = JsonConvert.DeserializeObject<Customer>(json);
string newJson = JsonConvert.SerializeObject(customer);

我做了一个小提琴here 来演示。

【讨论】:

    【解决方案2】:

    你可以试试这个。

    添加空类 public class Customer : Dictionary&lt;string, Data&gt;{} //empty class

    并更新您现有的代码

    //solution 1    
    JObject jsonone = JObject.Parse(jsonString);
    
    //Add this line
    var token = jsonone.SelectToken("Customer").ToString();
    
    //solution 2 - update jsonString to token variable created above.
    var collection_three = JsonConvert.DeserializeObject<Customer>(token);
    

    【讨论】:

      猜你喜欢
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      相关资源
      最近更新 更多