【问题标题】:How to create a DataTable based on the Json deserialized JArray Data?如何基于 Json 反序列化的 JArray 数据创建 DataTable?
【发布时间】:2014-08-11 21:26:50
【问题描述】:

我有闲置的 JArray 数据。我需要根据 Jarray 中的列名动态创建一个数据表,然后我需要插入数据。

你能帮我做这个操作吗?

<pre>

{[
{
"PID": 3,
"FirstName": "parveen",
"LastName": "a",
"Gender": "male"
},
{
"PID": 8,
"FirstName": "ramarao",
"LastName": "M",
"Gender": "male"
}
]}
</pre>

提前致谢

普纳

【问题讨论】:

    标签: c# arrays json datatable deserialization


    【解决方案1】:

    您的 JSON 输入无效。您应该删除第一个和最后一个括号,因为它是一个数组,而不是一个对象。如果您知道行类型,则应使用现有 JSON 库之一,并将数组反序列化为强类型列表。如果不知道类型,请使用 toDataTable 方法。

    我在示例中使用了以下库:

    http://james.newtonking.com/json

        private static void Main(string[] args)
        {
            var data =
                "[{\"PID\": 3,\"FirstName\": \"parveen\",\"LastName\": \"a\",\"Gender\": \"male\"},{\"PID\": 8,\"FirstName\": \"ramarao\",\"LastName\": \"M\",\"Gender\": \"male\"}]";
    
            var dattable = toDataTable(data);
    
            var list = toList(data);
        }
    
        class User
        {
            public int PID { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Gender { get; set; }
        }
    
        private static List<User> toList(string json)
        {
           return Newtonsoft.Json.JsonConvert.DeserializeObject<List<User>>(json);
        } 
    
        private static DataTable toDataTable(string json)
        {
            var result = new DataTable();
            var jArray = JArray.Parse(json);
            //Initialize the columns, If you know the row type, replace this   
            foreach (var row in jArray)
            {
                foreach (var jToken in row)
                {
                    var jproperty = jToken as JProperty;
                    if (jproperty == null) continue;
                    if (result.Columns[jproperty.Name] == null)
                        result.Columns.Add(jproperty.Name,typeof(string));
                }
            }
            foreach (var row in jArray)
            {
                var datarow = result.NewRow();
                foreach (var jToken in row)
                {
                    var jProperty = jToken as JProperty;
                    if (jProperty == null) continue;
                    datarow[jProperty.Name] = jProperty.Value.ToString();
                }
                result.Rows.Add(datarow);
            }
    
            return result;
        }
    

    【讨论】:

    • 我也需要使用上述功能,但是当我调试时,即使我在 jtoken 中有数据,jproperty 总是为空。你认为那里有什么问题?
    【解决方案2】:

    使用有效的 JArray,以下代码应该可以满足您的需求。

    DataTable MyTable = JsonConvert.DeserializeObject&lt;DataTable&gt;(YOURJARRAY.ToString());

    您需要为表命名。

    MyTable.TableName = "Test Table";
    

    【讨论】:

      【解决方案3】:

      这对我有用:

       DataTable dataTable = JsonConvert.DeserializeObject<DataTable>(JsonConvert.SerializeObject(validJArrayData));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        • 2014-08-11
        • 1970-01-01
        • 2016-05-14
        • 1970-01-01
        相关资源
        最近更新 更多