#c# #arrays #json #datatable #deserialization
#c# #массивы #json #datatable #десериализация
Вопрос:
У меня есть данные JArray. Мне нужно создать таблицу данных динамически на основе имен столбцов в Jarray, после этого мне нужно вставить данные.
Не могли бы вы, пожалуйста, помочь мне выполнить эту операцию.
<pre>
{[
{
"PID": 3,
"FirstName": "parveen",
"LastName": "a",
"Gender": "male"
},
{
"PID": 8,
"FirstName": "ramarao",
"LastName": "M",
"Gender": "male"
}
]}
</pre>
Заранее спасибо
пурна
Ответ №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 resu<
}
Комментарии:
1. Мне также нужно использовать вышеуказанную функцию, но когда я отлаживаю, свойство jproperty всегда имеет значение null, даже если у меня есть данные в jtoken. как вы думаете, в чем проблема?
Ответ №2:
При действительном JArray следующий код должен делать то, что вы хотите.
DataTable MyTable = JsonConvert.DeserializeObject<DataTable>(YOURJARRAY.ToString());
Вам нужно будет назвать таблицу.
MyTable.TableName = "Test Table";
Ответ №3:
Это сработало для меня:
DataTable dataTable = JsonConvert.DeserializeObject<DataTable>(JsonConvert.SerializeObject(validJArrayData));