I have a string like the following in C#. I need to loop through and create an HTML table output. I tried with JSON.NET but couldn\'t figure out how to retrieve the keys (Na
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>
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.
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"]
};