Newtsonsoft.Json - 使用嵌套数组将JSON反序列化为DataTable

时间:2017-09-01 14:07:53

标签: c# asp.net json datatable

我需要将以下Json字符串转换为DataTable。

Json示例:

[
    {
        'extension': '0001',
        'name': 'User 1',
        'email': 'user1@mail.se',
        'mobile': '+46000000',
        'profile': {
        'available': false,
        'name': 'Gone for the day',
        'until': '2017-09-01 08:00:00',
        'message': 'Do not call me'
    },
        'calls': [],
    },
    {
        'extension': '0002',
        'name': 'User 2',
        'email': 'user2@mail.se',
        'mobile': '+46000000',
        'profile': {
        'available': false,
        'name': 'Gone for the day',
        'until': '2017-09-01 08:00:00',
        'message': 'Do not call me'
    },
        'calls': [],
    }
]

我能够在'个人资料之前阅读所有内容:如何在个人资料下访问下一级数据? (profile.avialable,profile.name,profile.until,profile.message)并将其添加到datatable?

这是我的课程

public class Profile
{
    public bool available { get; set; }
    public string name { get; set; }
    public string until { get; set; }
    public object message { get; set; }
}


public class RootObject
{
    public string name { get; set; }
    public string extension { get; set; }
    public string mobile { get; set; }
    public Profile profile { get; set; }
}

这是我的代码

public static DataTable ToDataTable<T>(List<T> items)
{
    DataTable dataTable = new DataTable(typeof(T).Name);

    //Get all the properties
    System.Reflection.PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (PropertyInfo prop in Props)
    {
        //Defining type of data column gives proper data table 
        var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType);
        //Setting column names as Property names
        dataTable.Columns.Add(prop.Name, type);
    }
    foreach (T item in items)
    {
        var values = new object[Props.Length];
        for (int i = 0; i < Props.Length; i++)
        {
            //inserting property values to datatable rows
            values[i] = Props[i].GetValue(item, null);
        }
        dataTable.Rows.Add(values);
    }
    //put a breakpoint here and check datatable
    return dataTable;
}


PopulateList()
{          
    var data = JsonConvert.DeserializeObject<List<RootObject>>(JsonData);
    DataTable dt = ToDataTable(data);

    GridView1.DataSource = dt;
    GridView1.DataBind();
}

JsonData包含我的JSON

任何人都有线索?

2 个答案:

答案 0 :(得分:0)

Json工作正常

    string JsonData = @"[
        {
        'extension': '0001',
        'name': 'User 1',
        'email': 'user1@mail.se',
        'mobile': '+46000000',
        'profile': {
        'available': false,
        'name': 'Gone for the day',
        'until': '2017-09-01 08:00:00',
        'message': 'Do not call me'
        },
        }
        ]";
    var data = JsonConvert.DeserializeObject<List<RootObject>>(JsonData); 

RootObjects包含有效的Profile个对象,问题不在于Json解析器。在dataTable.Rows.Add(values);中,您的values属性为“有效”(它包含正确且已填充的Profile个对象)。检查您是否使用有效的方法将数据传递到数据库中。

答案 1 :(得分:0)

如果我正确地获得此信息,您希望在同一行的“个人资料”下显示数据,以便每行看起来像{“name”,“extension”,“mobile”,“profile.available”, “profile.name”,“profile.until”,“profile.message”}。

问题是代码是根据RootObject类中的对象类型(名称,扩展名,移动设备,配置文件)添加列,并且不会进一步查看其类型以查看它们是否还具有任何属性。

在代码的这一部分:

foreach (PropertyInfo prop in Props)
{
    var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.
    dataTable.Columns.Add(prop.Name, type);
}

您必须添加一个检查以查看RootObject中的对象是否还有其他属性。 在此基础上,您还必须更改第二个循环以考虑要添加到表中每行数据的子属性。