【问题标题】:deserializing Json Object to C#将 Json 对象反序列化为 C#
【发布时间】:2017-06-28 16:12:15
【问题描述】:

试图反序列化 json 但由于它具有动态键值,无法获取 testTimedict 对象中的数据

JSON:

{ 
  "results": {  
    "timesheets": {
      "123456": { 
        "id": 123456,
        "user_id": 36036,
        "jobcode_id": 374398,
        ..
      },
      "635241": {
        "id": 635241,
        "user_id": 36036,
        "jobcode_id": 0,
        ..
      },
      ..   
    }
  }
}

C#:

public class testroot
{
    private testresults _results;

    [DataMember(Name = "results")]
    public testresults Results {get; set;}
}

[DataContract()]
public class testresults
{
    private testTimedict _timesheet;

    [DataMember(Name = "timesheets")]
    public testTimedict timesheetList {get; set;}
}

[DataContract(Name = "timesheets")]
public class testTimedict
{
    private Dictionary<string, TimeSheets> _timesheet;

    [DataMember()]
    public Dictionary<string, TimeSheets> timesheetList {get; set;}
}

public class TimeSheets
{

    private int _id;
    private int _user_id;
    private int _jobcode_id;
    [DataMember(Name = "id")]
    public int ID {
        get { return _id; }
        set { _id = value; }
    }

    [DataMember(Name = "user_id")]
    public int user_id {
        get { return _user_id; }
        set { _user_id = value; }
    }

    [DataMember(Name = "jobcode_id")]
    public int jobcode_id {
        get { return _jobcode_id; }
        set { _jobcode_id = value; }
    }
}

我正在将字符串反序列化为字典,但反序列化器不会为最里面的子对象返回任何内容,即“123456”{}

【问题讨论】:

  • TimeSheets 类的代码在哪里?
  • 添加了时间表类

标签: c# json api parsing


【解决方案1】:

我使用你的类,但请考虑更好的命名方式

[DataContract]
public class testroot
{
    private testTimedict _results;

    [DataMember(Name = "results")]
    public testTimedict Results { get; set; }
}

[DataContract]
public class testTimedict
{
    private Dictionary<string, TimeSheets> _timesheet;

    [DataMember(Name = "timesheets")]
    public Dictionary<string, TimeSheets> timesheetList { get; set; }
}

[DataContract]
public class TimeSheets
{

    private int _id;
    private int _user_id;
    private int _jobcode_id;
    [DataMember(Name = "id")]
    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }

    [DataMember(Name = "user_id")]
    public int user_id
    {
        get { return _user_id; }
        set { _user_id = value; }
    }

    [DataMember(Name = "jobcode_id")]
    public int jobcode_id
    {
        get { return _jobcode_id; }
        set { _jobcode_id = value; }
    }
}

您可以使用 Json.Net 反序列化 - JsonConvert.DeserializeObject&lt;testroot&gt;(test);

【讨论】:

    【解决方案2】:

    时间表的“动态键”与时间表对象中的id 属性相同,那么为什么不消除重复并将timesheets 设为数组呢?像这样:

    { 
        "results": {  
            "timesheets": [ { 
                "id": 123456,
                "user_id": 36036,
                "jobcode_id": 374398
            }, {
                "id": 635241,
                "user_id": 36036,
                "jobcode_id": 0
            }]  
        }
    }
    

    这大大清理了你的 c# 模型:

    public Results results { get; set; }
    
    public class Timesheet
    {
        public int id { get; set; }
        public int user_id { get; set; }
        public int jobcode_id { get; set; }
    }
    
    public class Results
    {
        public List<Timesheet> timesheets { get; set; }
    }
    

    【讨论】:

    • 如何将 Jobject 转换为 Jrray?
    • 啊,假设你不能改变你的 json 结构,你肯定会使用JObject.Parse(yourJson.ToString())["results"]["timesheets"].Properties()。然后你会遍历那些。
    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多