12

Does anyone know how to convert a JSON string into a DataTable in ASP.NET? I know about Deserializing; I just want the datatable returned. Can anyone tell me how to convert it to a datatable?

0

5 Answers 5

22

Assuming that your JSON string is a list of objects, each object will correspond to a row in the DataTable, viz:

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;
}

This requires Newtonsoft's Json.NET framework.

Sign up to request clarification or add additional context in comments.

1 Comment

The builtin DataTable doesn't serialize column information, it has to infer the column type from the data. I've created an improved converter here github.com/chris-herring/DataTableConverter
11
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)));

Code for the above method

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;
    }


}

Deserialize your jsonstring to some class

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

Write following extension method to your project

 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;
}

Call extension method like

UserList.ToDataTable<User>();

1 Comment

I'm trying to use the above extension method - No Errors on build. But I do get a compilation error : "Compiler Error Message: CS0121: The call is ambiguous between the following methods or properties: 'ExtensionHelpers.ToDataTable<_Default.Jobs>(System.Collections.Generic.IList<_D‌​efault.Jobs>)' and 'ExtensionHelpers.ToDataTable<_Default.Jobs>(System.Collections.Generic.IList<_D‌​efault.Jobs>)'" Do you have any idea what might be causing it?
2

This question is sorta outdated, but someone may be looking for answers, so here it goes. It didn't work with old JSON.NET, but today I upgraded to latest version and viola! It works great.

Have serialized a DataTable into Json back and forth, zero issues! This is an awesome new feature.

Comments

1

I am not sure which JSON library you are using, but you might want to take a look at JSON.NET as there is a converter object type in there called this:

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

I have not used this functionality before but you could have a go with it.

Comments

0

If you are in framework 2.0, you must import Json.net (http://json.codeplex.com/) in your project, if your framework is superior, it has JSON.

The code in vb.net framework 2.0:

Dim Table DataTable

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

1 Comment

Be carefull json.net (json.codeplex.com), doesn´t respect table.tablename and primary keys. You must assing it after convert the db.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.