Parse json string using JSON.NET
You can use .NET 4's dynamic type and built-in JavaScriptSerializer to do that. Something like this, maybe:
string json = "{\"items\":[{\"Name\":\"AAA\",\"Age\":\"22\",\"Job\":\"PPP\"},{\"Name\":\"BBB\",\"Age\":\"25\",\"Job\":\"QQQ\"},{\"Name\":\"CCC\",\"Age\":\"38\",\"Job\":\"RRR\"}]}";var jss = new JavaScriptSerializer();dynamic data = jss.Deserialize<dynamic>(json);StringBuilder sb = new StringBuilder();sb.Append("<table>\n <thead>\n <tr>\n");// Build the header based on the keys in the// first data item.foreach (string key in data["items"][0].Keys) { sb.AppendFormat(" <th>{0}</th>\n", key);}sb.Append(" </tr>\n </thead>\n <tbody>\n");foreach (Dictionary<string, object> item in data["items"]) { sb.Append(" <tr>\n"); foreach (string val in item.Values) { sb.AppendFormat(" <td>{0}</td>\n", val); }}sb.Append(" </tr>\n </tbody>\n</table>");string myTable = sb.ToString();
At the end, myTable
will hold a string that looks like this:
<table> <thead> <tr> <th>Name</th> <th>Age</th> <th>Job</th> </tr> </thead> <tbody> <tr> <td>AAA</td> <td>22</td> <td>PPP</td> <tr> <td>BBB</td> <td>25</td> <td>QQQ</td> <tr> <td>CCC</td> <td>38</td> <td>RRR</td> </tr> </tbody></table>
I did not test the following snippet... hopefully it will point you towards the right direction:
var jsreader = new JsonTextReader(new StringReader(stringData)); var json = (JObject)new JsonSerializer().Deserialize(jsreader); var tableRows = from p in json["items"] select new { Name = (string)p["Name"], Age = (int)p["Age"], Job = (string)p["Job"] };
If your keys are dynamic I would suggest deserializing directly into a DataTable:
class SampleData { [JsonProperty(PropertyName = "items")] public System.Data.DataTable Items { get; set; } } public void DerializeTable() { const string json = @"{items:[" + @"{""Name"":""AAA"",""Age"":""22"",""Job"":""PPP""}," + @"{""Name"":""BBB"",""Age"":""25"",""Job"":""QQQ""}," + @"{""Name"":""CCC"",""Age"":""38"",""Job"":""RRR""}]}"; var sampleData = JsonConvert.DeserializeObject<SampleData>(json); var table = sampleData.Items; // write tab delimited table without knowing column names var line = string.Empty; foreach (DataColumn column in table.Columns) line += column.ColumnName + "\t"; Console.WriteLine(line); foreach (DataRow row in table.Rows) { line = string.Empty; foreach (DataColumn column in table.Columns) line += row[column] + "\t"; Console.WriteLine(line); } // Name Age Job // AAA 22 PPP // BBB 25 QQQ // CCC 38 RRR }
You can determine the DataTable column names and types dynamically once deserialized.