将 Json 转换为列表 <ExpandoObject>

Convert Json to List<ExpandoObject>

我目前正在开发 .NET Framework 4.7.2 应用程序。我正在从 Web API 中检索数据作为 JSON 字符串结果,我需要将结果转换为 IEnumerable 或 ExpandoObject 的 IList。

我的 JSON 可以有动态属性,看起来像这样:

{ "data" : [
   {"Id":1, Text:"Test1", coolProp: 213 },
   {"Id":2, Text:"Test2"},
   {"Id":3, Text:"Test3", otherProp: "cool" },
]}

我需要 select JSON 对象,没有键 "data" 和 return ExpandoObjects 的动态列表。

我当前的 C# 如下所示:

var json = JsonConvert.DeserializeObject<ExpandoObject>(await response.Content.ReadAsStringAsync());
var result = json.FirstOrDefault(x => x.Key == "data").Value;

这工作正常,但结果只是一个包含多个 ExpandoObject 的简单对象。

我无法将结果(无论是隐式还是显式)转换为 List<ExpandoObject>

当我尝试 return 结果时,错误消息如下:

无法将类型 'object' 隐式转换为列表。

当我尝试显式转换时,结果为空:

var result= json.FirstOrDefault(x => x.Key == "data").Value as List<IDictionary<int, ExpandoObject>>;

没有演员的结果看起来像立即window:

result
Count = 7
    [0]: {System.Dynamic.ExpandoObject}
    [1]: {System.Dynamic.ExpandoObject}
    [2]: {System.Dynamic.ExpandoObject}
    [3]: {System.Dynamic.ExpandoObject}
    [4]: {System.Dynamic.ExpandoObject}
    [5]: {System.Dynamic.ExpandoObject}
    [6]: {System.Dynamic.ExpandoObject}

你知道如何解决这个问题吗?或者,您知道更好的方法吗?我不想在我的结果中 return 键 "data",只是一个简单的动态对象列表。

谢谢!!

我想我找到了您的 problem.The 问题的解决方案,我得到的是一旦您获得第一个密钥,它就会将其解释为 object 而不是 expandoObject。但是因为你想要一个 dictionary 你可以把它放在键的字典函数中。

var json = JsonConvert.DeserializeObject<ExpandoObject>(jsonData);
var result = json.FirstOrDefault(x => x.Key == "data").Value;
var items = ((IEnumerable<Object>)json.FirstOrDefault(x => x.Key == "data").Value).ToDictionary(x => ((ExpandoObject)x).FirstOrDefault(y=>y.Key == "Id").Value, x=>x);`

如果您需要结果 dictionaryDictionary<int,expandoObject> 您可以为此替换最后一行:

Dictionary<int, ExpandoObject> items = ((IEnumerable<Object>)json.FirstOrDefault(x => x.Key == "data").Value).ToDictionary(x => int.Parse(((ExpandoObject)x).FirstOrDefault(y=>y.Key == "Id").Value.ToString()), x=>(ExpandoObject)x);`

希望是你需要的。

您可以尝试解析 json 并准确提取您需要的内容。 我假设您要在根元素内定位 data 而不是 data 本身。

所以你继续

JObject.Parse(myJson)["data"]

此外,如果您希望结果为列表,则将其反序列化为 List<ExpandObject> 而不是 ExpandObject

这是您可以在本地测试的完整工作演示 -

 internal class ExpandObject
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public string coolProp { get; set; }
        public string otherProp { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            String text = "{\"data\":[{\"Id\":1,\"Text\":\"Test1\",\"coolProp\":213},{\"Id\":2,\"Text\":\"Test2\"},{\"Id\":3,\"Text\":\"Test3\",\"otherProp\":\"cool\"}]}";
            var deserialized = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ExpandObject>>(Convert.ToString(JObject.Parse(text)["data"]));
            Console.ReadLine();
        }
    }