将JSON对象/字符串转换为C#动态对象并可以访问属性/值?

时间:2019-04-15 15:46:43

标签: c# json dynamic reflection

我试图获取一个巨大的JSON文件(可以是一个字符串),却不知道我想要读取的数据的实际结构并将其作为C#中的类进行处理。我尝试使用JSON反序列化它,但是我不确定在那之后应该去哪里。我当时在考虑使用Reflections,但不确定我需要什么数据。

我试图反序列化对象,如代码所示。但是我想测试它是否是正确的对象类型,以防它不是我希望失败,但是我似乎无法通过这一部分。我也不确定如何处理支票内的反射。我知道我应该进行迭代,但是不确定对象内部的哪些属性值将包含所需的内容。

string jsonData = sr.ReadToEnd();
dynamic data = JsonConvert.DeserializeObject(jsonData);
if (data is List<dynamic>)
{
    data.GetType().GetProperties();
}

我想要一个对JSON文件/字符串中的数据具有全部访问权限的对象。

2 个答案:

答案 0 :(得分:1)

我认为您的问题之一是使用JArray而不是List,并且还需要将项目强制转换为JObject。 使用Newtonsoft.Json和Newtonsoft.Json.Linq,然后您可以阅读您的Json作为示例:

string __content = "[ {\"name\": \"person1\" , \"age\": 33} , {\"name\": \"person2\" , \"age\" : 23} ]";

        dynamic data = JsonConvert.DeserializeObject(__content);
        // make sure you have an array of object
        if (data is Newtonsoft.Json.Linq.JArray)
        {
            int i = 0;
            foreach (dynamic item in data)
            {
                // get the property of the object 
                JObject currentitem = item as JObject;
                if (currentitem != null)
                {
                    // access to value of each property
                    foreach (JProperty p in currentitem.Properties())
                    {
                        Console.WriteLine("[" + i + "] : " + p.Name + ":" + p.Value.ToString());
                    }
                    i++;
                }
            }
        }

答案 1 :(得分:-3)

您可以将DeserializeObject方法与通用类型一起使用。为了确保您要转换为Type。 这意味着您的代码将如下所示:

var data = JsonConvert.DeserializeObject<T>(jsonData);

T 是要解析的类。 如果无法将Json字符串解析到您的类,则此方法将引发异常。 我想这就是您想要的。