C# 从动态JSON数组中提取数据
我正在将动态JSON对象转换为C#中的Excel。我已经尝试了以下步骤。 从数据库中,我得到以下作为字符串的响应C# 从动态JSON数组中提取数据,c#,arrays,json,dynamic,C#,Arrays,Json,Dynamic,我正在将动态JSON对象转换为C#中的Excel。我已经尝试了以下步骤。 从数据库中,我得到以下作为字符串的响应 [{“ResourceName”:“啊”,“Projectd”:1,“WeekNo”:2,“2019年12月2日”:7.00,“2019年12月3日”:7.50,“2019年12月5日”:7.50,“2019年12月6日”:7.00},{“ResourceName”:“CK”,“Projectd”:1,“WeekNo”:2,“2019年12月2日”:6.00,“2019年12月3日”
[{“ResourceName”:“啊”,“Projectd”:1,“WeekNo”:2,“2019年12月2日”:7.00,“2019年12月3日”:7.50,“2019年12月5日”:7.50,“2019年12月6日”:7.00},{“ResourceName”:“CK”,“Projectd”:1,“WeekNo”:2,“2019年12月2日”:6.00,“2019年12月3日”:5.00,“2019年12月5日”:2.00,“2019年12月6日”:5.00},{“ResourceName”:“啊”,“Projectd”:1,“WeekNo”:3,“2019年12月9日”:6.00,“2019年12月10日”:7.50,“2019年12月11日”:7.00,“2019年12月12日”:7.50,“2019年12月13日”:8.00},{“资源名称”:“CK”,“projectd”:1,“WeekNo”:3,“2019年12月9日”:6.00,“2019年12月10日”:4.00,“2019年12月11日”:null,“2019年12月12日”:5.00,{“资源名称”:“SL”,“projectd”:1,“WeekNo”:3,“2019年12月9日”:null,“2019年12月10日”:1.50,“null”2019年12月12日:1.50,“2019年12月13日”:0.50},{“ResourceName”:“啊”,“Projectd”:1,“WeekNo”:4,“2019年12月16日”:7.00},{“ResourceName”:“CK”,“Projectd”:1,“WeekNo”:4,“2019年12月16日”:3.00}]
我需要将上面的字符串转换为JSON并执行循环操作,以便为Excel创建设置标题和详细值。我使用了下面的方法创建了一个动态
对象
ResourceName和动态日期应作为列标题。由于date
值是动态的,因此无法创建模型
using System.Web.Helpers;
dynamic jsonObject = Json.Decode(response);
我能够从QuickWatch中提取值,但是,输出仅在运行时生成,如下所示
(new System.Collections.Generic.Mscorlib_DictionaryDebugView<string, object>(((System.Web.Helpers.DynamicJsonObject)((System.Web.Helpers.DynamicJsonArray)jsonObject)._arrayValues[0])._values).Items[0]).Key
(新System.Collections.Generic.Mscorlib_字典BugView(((System.Web.Helpers.DynamicJsonObject)((System.Web.Helpers.DynamicJsonArray)jsonObject)。_数组值[0])。_值)。项[0])。键
是否有方法循环遍历动态数组内容
只需获取字符串并使用JavaScriptSerializer将其反序列化为本机对象。例如,使用以下json: 现在,您可以通过执行以下操作将JSON字符串反序列化为动态字符串数组:
JavaScriptSerializer js = new JavaScriptSerializer();
var resourceData = js.Deserialize<Dynamic[]>(json);
JavaScriptSerializer js=新的JavaScriptSerializer();
var resourceData=js.Deserialize(json);
我建议将JSON反序列化为字典集合,而不是使用动态
,此方法提供类型安全性和迭代。以下示例使用Newtonsoft.JSON NuGet包:
sample.json:
[
{
"ResourceName": "AH",
"ProjectID": 1,
"WeekNo": 2,
"02 Dec 2019": 7.00,
"03 Dec 2019": 7.50,
"04 Dec 2019": 7.00,
"05 Dec 2019": 7.50,
"06 Dec 2019": 7.00
},
{
"ResourceName": "CK",
"ProjectID": 1,
"WeekNo": 2,
"02 Dec 2019": 6.00,
"03 Dec 2019": 5.00,
"04 Dec 2019": 3.00,
"05 Dec 2019": 2.00,
"06 Dec 2019": 5.00
},
{
"ResourceName": "AH",
"ProjectID": 1,
"WeekNo": 3,
"09 Dec 2019": 6.00,
"10 Dec 2019": 7.50,
"11 Dec 2019": 7.00,
"12 Dec 2019": 7.50,
"13 Dec 2019": 8.00
},
{
"ResourceName": "CK",
"ProjectID": 1,
"WeekNo": 3,
"09 Dec 2019": 6.00,
"10 Dec 2019": 4.00,
"11 Dec 2019": null,
"12 Dec 2019": 5.00,
"13 Dec 2019": 4.00
},
{
"ResourceName": "SL",
"ProjectID": 1,
"WeekNo": 3,
"09 Dec 2019": null,
"10 Dec 2019": 1.50,
"11 Dec 2019": null,
"12 Dec 2019": 1.50,
"13 Dec 2019": 0.50
},
{
"ResourceName": "AH",
"ProjectID": 1,
"WeekNo": 4,
"16 Dec 2019": 7.00
},
{
"ResourceName": "CK",
"ProjectID": 1,
"WeekNo": 4,
"16 Dec 2019": 3.00
}
]
代码:
static void Main(字符串[]args)
{
字符串json=File.ReadAllTextAsync(“sample.json”).Result;
var deserializedJson=JsonConvert.DeserializeObject(json);
foreach(反序列化djson中的var字典)
{
Console.WriteLine(“--Record--”);
foreach(字典中的var keyValuePair)
{
WriteLine($“{keyValuePair.Key}:{keyValuePair.Value}”);
}
Console.WriteLine();
}
}
输出:
您应该使用JSON.NET并向其传递一个字典示例@styx JSON字段是动态的。因此无法创建模型。谢谢Bhumik。
dynamic
的定义是什么?dynamic关键字是C#4.0中的新关键字,用于告诉编译器变量的类型可以更改,或者直到运行时才知道。请将其视为能够与对象交互而不必强制转换它。
static void Main(string[] args)
{
string json = File.ReadAllTextAsync("sample.json").Result;
var deserializedJson = JsonConvert.DeserializeObject<IEnumerable<IDictionary<string, string>>>(json);
foreach(var dictionary in deserializedJson)
{
Console.WriteLine(" -- Record --");
foreach(var keyValuePair in dictionary)
{
Console.WriteLine($"{keyValuePair.Key}:{keyValuePair.Value}");
}
Console.WriteLine();
}
}