如何仅使用动力学将JSON反序列化为简单的Dictionary <string,object>到datagridview?

时间:2019-06-14 13:39:44

标签: c# .net json javascriptserializer

我有一个简单的键/值列表,它来自Web服务器,需要将这些数据放入datagridview中,而没有像JSON.Net这样的任何dll。我发现Count等于3(数组json),但是我无法提取它。示例:

        var json = new WebClient().DownloadString("https://server.com/getMsg.aspx");
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        var dictObj = serializer.Deserialize<Dictionary<string, dynamic>>(json);
        List<Person> list = new List<Person>();
        for (int i = 0; i < dictObj["result"].Count; i++)
        {
            Person p = new Person();
            p.Id = dictObj["result"].Value[i].id;
            p.Name = dictObj["result"].Value[i].name;
            p.Age = dictObj["result"].Value[i].age; 
            list.Add(p);
        }

        datagridView1.DataSource = list;

下载的json显示如下:

{"result": [                                                                
    {"id": "14", "name": "sdfsdfsdf", "age": "40" },
    {"id": "13", "name": "vfdgdg", "age": "50" },
    {"id": "12", "name": "grgetge","age": "60" } ] }

1 个答案:

答案 0 :(得分:3)

我会尝试创建一个RootObject类来承载您的Person集合实例。

然后使用serializer.Deserialize<RootObject>来制作。

public class Person
{
    public string id { get; set; }
    public string name { get; set; }
    public string age { get; set; }
}

public class RootObject
{
    public List<Person> result { get; set; }
}

然后,您可以直接使用List<Person>代替for loop

var dictObj = serializer.Deserialize<RootObject>(json);
datagridView1.DataSource = dictObj.result;

注意

我建议您使用Json.net第三方库而不是JavaScriptSerializer,因为它的性能会比JavaScriptSerializer更好

使用非常简单,使用JsonConvert.DeserializeObject<T>()可以将json反序列化为对象。

var dictObj = JsonConvert.DeserializeObject<RootObject>(Json);
datagridView1.DataSource = dictObj.result;