Как создать таблицу данных на основе десериализованных данных Json JArray?

#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));