将 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);`
如果您需要结果 dictionary
为 Dictionary<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();
}
}
我目前正在开发 .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);`
如果您需要结果 dictionary
为 Dictionary<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();
}
}