Как преобразовать JSON в Dataatable? - PullRequest
8 голосов
/ 04 октября 2011

Кто-нибудь знает, как преобразовать строку json в DataTable из asp.net?Я узнал о десериализации, ей нужен класс, я просто хочу, чтобы данные были возвращены.Может кто-нибудь сказать мне, как преобразовать его в Dataatable?

Ответы [ 5 ]

18 голосов
/ 04 октября 2011

Предполагая, что ваша строка JSON является списком объектов, каждый объект будет соответствовать строке в DataTable, а именно:

    public DataTable DerializeDataTable()
    {
        const string json = @"[{""Name"":""AAA"",""Age"":""22"",""Job"":""PPP""},"
                           + @"{""Name"":""BBB"",""Age"":""25"",""Job"":""QQQ""},"
                           + @"{""Name"":""CCC"",""Age"":""38"",""Job"":""RRR""}]";
        var table = JsonConvert.DeserializeObject<DataTable>(json);
        return table;
    }

Для этого требуется Json.NET framework .

Если ваша структура JSON отличается, пожалуйста, опубликуйте ее.С наилучшими пожеланиями.

8 голосов
/ 08 ноября 2013
using Newtonsoft.Json;

string json = "[{"clientID":"1788","projectID":"19"},{"clientID":"1789","projectID":"24"},{"clientID":"1790","projectID":"24"},{"clientID":"1790","projectID":"23"},{"clientID":"1790","projectID":"21"}]";

DataTable tester = (DataTable) JsonConvert.DeserializeObject(json, (typeof(DataTable)));

Код для вышеуказанного метода

public object Deserialize(string jsonText, Type valueType)
{
    try
    {
        Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();

        json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
        json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
        json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
        json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

        StringReader sr = new StringReader(jsonText);

        Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr);
        object result = json.Deserialize(reader, valueType);
        reader.Close();
        return result;
    }
    catch (Exception ex)
    {
        throw ex;
    }


}

Десериализация вашей jsonstring в некоторый класс

List<User> UserList = JsonConvert.DeserializeObject<User>(jsonString);

Напишите следующий метод расширения для вашего проекта

public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection props =
    TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    for(int i = 0 ; i < props.Count ; i++)
    {
    PropertyDescriptor prop = props[i];
    table.Columns.Add(prop.Name, prop.PropertyType);
    }
    object[] values = new object[props.Count];
    foreach (T item in data)
    {
    for (int i = 0; i < values.Length; i++)
    {
        values[i] = props[i].GetValue(item);
    }
    table.Rows.Add(values);
    }
    return table;        
}

Вызовите метод расширения как

UserList.ToDataTable<User>();
2 голосов
/ 31 августа 2012

Этот вопрос как бы устарел, но кто-то может искать ответы, так что вот оно.Он не работал со старой JSON.NET , но сегодня я обновился до последней версии и альта!Это прекрасно работает.

Сериализовал DataTable в Json туда-сюда, ноль проблем!Это потрясающая новая функция.

Надеюсь, она поможет и другим.Приветствия.

0 голосов
/ 23 февраля 2012

Все просто.

Если вы работаете в framework 2.0, вы должны импортировать json.net (http://json.codeplex.com/) в ваш проект, если ваш фреймворк лучше, он имеет json.

Код в фреймворке vb.net 2.0:

Dim Table DataTable

Table = Json.JsonConvert.DeserializeObject(Of DataTable)(Json_string)

Вот и все.

0 голосов
/ 06 октября 2011

Я не уверен, какую библиотеку JSON вы используете, но вы, возможно, захотите взглянуть на JSON.NET, так как там есть тип объекта конвертера, называемый следующим:

 Newtonsoft.Json.Converters.DataTableConverter
    // Summary:
    //     Converts a System.Data.DataTable to and from JSON.

Раньше я не использовал эту функцию, но вы могли бы попробовать ее.

...