Parse json string using JSON.NET

前端 未结 3 1782
别跟我提以往
别跟我提以往 2020-12-12 17:31

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

相关标签:
3条回答
  • 2020-12-12 17:51

    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>
    
    0 讨论(0)
  • 2020-12-12 18:05

    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.

    0 讨论(0)
  • 2020-12-12 18:09

    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"]
                     };
    
    0 讨论(0)
提交回复
热议问题