【问题标题】:Convert Json to List<ExpandoObject>将 Json 转换为 List<ExpandoObject>
【发布时间】:2020-08-14 21:14:16
【问题描述】:

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

我的 JSON 可以具有动态属性,如下所示:

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

我需要选择 JSON 对象,不带键“数据”并返回 ExpandoObjects 的动态列表。

我当前的 C# 如下所示:

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

这很好用,但结果只是一个包含几个 ExpandoObjects 的简单对象。

我无法将结果转换为List&lt;ExpandoObject&gt;,无论是隐式还是显式。

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

无法将类型“object”隐式转换为 List。

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

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

没有强制转换的结果在即时窗口中看起来像这样:

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}

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

谢谢!!

【问题讨论】:

  • 你能发布你的 ExpandoObject 对象吗?
  • expandoobject 的内容包含了 json 的值,到目前为止还不错
  • json.FirstOrDefault(x =&gt; x.Key == "data").ValueValue 的类型是什么?那不是ExpandoObject的数组吗?
  • 你能把它转换成ExpandoObject的数组并调用.ToList()吗?
  • 感谢阿曼 B 的帮助!

标签: c# asp.net json expandoobject


【解决方案1】:

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

所以你继续

JObject.Parse(myJson)["data"]

此外,如果您希望结果为列表,请将其反序列化为 List&lt;ExpandObject&gt; 而不是 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();
        }
    }

【讨论】:

  • 完美运行!我没想到只使用 JObject.Parse... 非常感谢! :)
【解决方案2】:

我想我找到了您问题的解决方案。我遇到的问题是,一旦您获得第一个密钥,它就会将其解释为 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);`

如果您需要将结果 dictionary 变为 Dictionary&lt;int,expandoObject&gt;,您可以为此替换最后一行:

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);`

希望这是你需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 2014-09-09
    • 2019-05-08
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多