【问题标题】:convert json value to datatable missing some value将 json 值转换为缺少某些值的数据表
【发布时间】:2017-07-06 17:55:11
【问题描述】:

我想将 json 值转换为数据表,但是当我转换为数据表时,它缺少要在数据表中转换的 id 值。

json

 {
  "territories": {
    "a10b4b1e-8400-4613-8c90-5d282de6a8a6": {
      "id": "a10b4b1e-8400-4613-8c90-5d282de6a8a6",
      "name": "Connecticut",
      "center": [
        41603071,
        -73087651
      ],
      "timeZoneCode": "America/New_York",
      "languageCode": null
    },
    "dc3d9d82-611e-41ba-a6f6-2c33ac5eebd1": {
      "id": "dc3d9d82-611e-41ba-a6f6-2c33ac5eebd1",
      "name": "Orlando",
      "center": [
        28538321,
        -81379242
      ],
      "timeZoneCode": "America/New_York",
      "languageCode": null
    }

  }
}

json转数据表的代码

   private void ConvertJsonToDataTable( string jasonstring)
        {
            try
            {
                string jsonString = jasonstring;

                if (!String.IsNullOrWhiteSpace(jsonString))
                {
                    dynamic dynObj = JsonConvert.DeserializeObject(jsonString);
                    var sOffers = dynObj.territories;
                  //  var sCoupons = dynObj.coupons;

                    DataTable dtPromotions = new DataTable();
                    dtPromotions.Columns.Add("id", typeof(string));
                    dtPromotions.Columns.Add("name", typeof(string));
                    dtPromotions.Columns.Add("timeZoneCode", typeof(string));
                    dtPromotions.Columns.Add("languageCode", typeof(string));

                    foreach (var cou in sOffers)
                    {
                        string cou1 = Convert.ToString(cou);
                        string[] RowData = Regex.Split(cou1.Replace("{", "").Replace("}", ""), ",");
                        DataRow nr = dtPromotions.NewRow();
                        foreach (string rowData in RowData)
                        {
                            try
                            {
                                int idx = rowData.IndexOf(":");
                                string RowColumns = rowData.Substring(0, idx - 1).Replace("\"", "").Trim();
                                string RowDataString = rowData.Substring(idx + 1).Replace("\"", "");
                                nr[RowColumns] = RowDataString;
                            }
                            catch (Exception ex)
                            {
                                continue;
                            }
                        }
                        dtPromotions.Rows.Add(nr);
                    }

}
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "ERROR",MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

【问题讨论】:

  • a10b4b1e-8400-4613-8c90-5d282de6a8a6 是稳定的还是每次针对不同的 terrotries 都有不同的值
  • @Abhishek 它每次为不同的 Territroy 提供不同的价值
  • 我相信如果您将区域解析为一些区域类,然后(如果需要)您可以将这些值映射到数据表,您的代码将更具可读性
  • @SergeyBerezovskiy 你希望我使用这种方法List <Territories > tr = JsonConvert.DeserializeObject<List<Territories>>(ter);
  • @A.Goutam 完全正确。之后foreach(var territory in tr) 您可以添加数据行而无需替换大括号和其他 json 内容

标签: c# json datatable


【解决方案1】:

您应该只替换该行:

string cou1 = Convert.ToString(cou);

用这个:

string cou1 = Convert.ToString(cou.Value);

【讨论】:

    【解决方案2】:

    我会这样做 -

        var json = "{'territories':{'a10b4b1e-8400-4613-8c90-5d282de6a8a6':{'id':'a10b4b1e-8400-4613-8c90-5d282de6a8a6','name':'Connecticut','center':[41603071,-73087651],'timeZoneCode':'America/New_York','languageCode':null},'dc3d9d82-611e-41ba-a6f6-2c33ac5eebd1':{'id':'dc3d9d82-611e-41ba-a6f6-2c33ac5eebd1','name':'Orlando','center':[28538321,-81379242],'timeZoneCode':'America/New_York','languageCode':null}}}";
        var obj = JsonConvert.DeserializeObject<RootObject>(json);
        var dt = new DataTable();
        dt.Columns.Add("id", typeof (string));
        dt.Columns.Add("name", typeof (string));
        dt.Columns.Add("timeZoneCode", typeof (string));
        dt.Columns.Add("languageCode", typeof (string));
        dt.Rows.Add(obj.territories.A10b4b1e840046138c905d282de6a8a6.id,
                   obj.territories.A10b4b1e840046138c905d282de6a8a6.name,
                   obj.territories.A10b4b1e840046138c905d282de6a8a6.timeZoneCode,
                   obj.territories.A10b4b1e840046138c905d282de6a8a6.languageCode);
    
        dt.Rows.Add(obj.territories.Dc3d9d82611e41baA6f62c33ac5eebd1.id,
                   obj.territories.Dc3d9d82611e41baA6f62c33ac5eebd1.name,
                   obj.territories.Dc3d9d82611e41baA6f62c33ac5eebd1.timeZoneCode,
                   obj.territories.Dc3d9d82611e41baA6f62c33ac5eebd1.languageCode);
    

    在哪里-

    public class A10b4b1e840046138c905d282de6a8a6
    {
        public string id { get; set; }
        public string name { get; set; }
        public List<int> center { get; set; }
        public string timeZoneCode { get; set; }
        public object languageCode { get; set; }
    }
    
    public class Dc3d9d82611e41baA6f62c33ac5eebd1
    {
        public string id { get; set; }
        public string name { get; set; }
        public List<int> center { get; set; }
        public string timeZoneCode { get; set; }
        public object languageCode { get; set; }
    }
    public class Territories
    {
        [JsonProperty("a10b4b1e-8400-4613-8c90-5d282de6a8a6")]
        public A10b4b1e840046138c905d282de6a8a6 A10b4b1e840046138c905d282de6a8a6{get; set;}
    
        [JsonProperty("dc3d9d82-611e-41ba-a6f6-2c33ac5eebd1")]
        public Dc3d9d82611e41baA6f62c33ac5eebd1 Dc3d9d82611e41baA6f62c33ac5eebd1{get; set;}
    }
    
    public class RootObject
    {
        public Territories territories{get; set;}
    }
    

    【讨论】:

    • 感谢您的代码。问题是,每次我获取数据时,a10b4b1e-8400-4613-8c90-5d282de6a8a6' ,'dc3d9d82-611e-41ba-a6f6-2c33ac5eebd1 中的值都会发生变化,所以我不能像在示例中创建 public class A10b4b1e840046138c905d282de6a8a6 那样使用该名称创建一个类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多