如何基于Json反序列化的JArray数据创建DataTable?

时间:2014-06-21 06:07:51

标签: c# arrays json datatable deserialization

我已经暂停了JArray数据。我需要根据Jarray中的列名动态创建一个数据表,之后我需要插入数据。

你能帮我做一下这个操作吗?

<pre>

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

提前致谢

普尔纳

3 个答案:

答案 0 :(得分:5)

您的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;
    }

答案 1 :(得分:0)

使用有效的JArray,下面的代码应该可以完成您想做的事情。

DataTable MyTable = JsonConvert.DeserializeObject<DataTable>(YOURJARRAY.ToString());

您将需要命名表格。

MyTable.TableName = "Test Table";

答案 2 :(得分:0)

这对我有用:

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