我需要将以下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
任何人都有线索?
答案 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中的对象是否还有其他属性。 在此基础上,您还必须更改第二个循环以考虑要添加到表中每行数据的子属性。