【发布时间】:2018-09-28 15:23:16
【问题描述】:
我有一个用 C# 编写的 Azure 函数,它通过 HTTP POST 请求接收 JSON,我确定其中的节点:ssid、dim、type、list_of_business_keys。列表中的每个项目都有一个或多个列,在我收到 JSON 之前,我不知道其名称和类型。假设对于第一个示例,它们是 column_1 和 column_2,均为 Int64 类型:
{ "ssid" : 1,
"dim" : 2,
"type" : 3,
"list_of_business_keys":
[
{"business_key" : {"column_1" : 100, "column_2" : 1000}},
{"business_key" : {"column_1" : 200, "column_2" : 1000}},
{"business_key" : {"column_1" : 300, "column_2" : 1000}},
{"business_key" : {"column_1" : 400, "column_2" : 1000}},
{"business_key" : {"column_1" : 500, "column_2" : 1000}}
]
}
我想要实现的是将此 JSON 转换为 DataTable,稍后我将使用它作为表类型参数从 Azure SQL 数据库调用存储过程。所以我希望这个 DataTable 看起来像这样:
我编写了以下代码来实现这一点:
#r "Microsoft.WindowsAzure.Storage"
#r "Newtonsoft.Json"
#r "System.Net"
#r "System.Data"
using System;
using System.Net;
using System.Data;
using System.Data.SqlClient;
using Microsoft.WindowsAzure.Storage.Table;
using Newtonsoft.Json;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
string resultAsString = await req.Content.ReadAsStringAsync();
KeyList keyList = JsonConvert.DeserializeObject<KeyList>(resultAsString);
List<ListOfBusinessKey> list = keyList.list_of_business_keys;
DataTable tbl = new DataTable();
tbl.Columns.Add(new DataColumn("ssid", typeof(Int64)));
tbl.Columns.Add(new DataColumn("dim", typeof(Int64)));
tbl.Columns.Add(new DataColumn("type", typeof(Int64)));
tbl.Columns.Add(new DataColumn("column_1", typeof(Int64)));
tbl.Columns.Add(new DataColumn("column_2", typeof(Int64)));
foreach (var key in list) {
tbl.Rows.Add(keyList.ssid, keyList.dim, keyList.type, key.business_key.column_1, key.business_key.column_2);
}
foreach (var row in tbl.Rows){
log.Info(row.ToString());
}
foreach (DataRow dataRow in tbl.Rows)
{
foreach (var item in dataRow.ItemArray)
{
log.Info(item.ToString());
}
}
return req.CreateResponse(keyList);
}
public class BusinessKey
{
public int column_1 { get; set; }
public int column_2 { get; set; }
}
public class ListOfBusinessKey
{
public BusinessKey business_key { get; set; }
}
public class KeyList
{
public int ssid { get; set; }
public int dim { get; set; }
public int type { get; set; }
public List<ListOfBusinessKey> list_of_business_keys { get; set; }
}
这似乎有效。
我的问题是,要反序列化收到的 JSON,我必须基于 JSON 的结构创建类。创建数据表也是如此。我知道 col 名称及其类型,所以我隐式地创建了 DataTable。但是如果我以前不知道结构会发生什么?
现在假设我收到以下 JSON:
{ "ssid" : 1,
"dim" : 2,
"type" : 3,
"list_of_business_keys":
[
{"business_key" : {"xxx" : "abc", "yyy" : 1000, "zzz" : 123}},
{"business_key" : {"xxx" : "cde", "yyy" : 1000, "zzz" : 456}},
{"business_key" : {"xxx" : "efg", "yyy" : 1000, "zzz" : 789}},
{"business_key" : {"xxx" : "hij", "yyy" : 1000, "zzz" : 12 }},
{"business_key" : {"xxx" : "klm", "yyy" : 1000, "zzz" : 345}}
]
}
我想收到以下 DT:
这是否可以更改代码,以“动态”将 JSON 转换为所需的 DataTable 格式?如果是,我应该怎么做才能做到这一点?
提前致谢!
【问题讨论】:
-
有多少 JSON 模式是固定的和可变的?属性
"ssid"、"dim"和"type"是否已修复?"list_of_business_keys"和"business_key"属性是否固定? -
"ssid", "dim", "type", "list_of_business_keys"和"business_key"已修复。只有business key(本例中为"xxx", "yyy", "zzz")内的节点是可更改的。当然,在一个 JSON 中,所有这些业务键列都将具有相同的名称(没有情况,我们在一行中有xxx,而在第二行中有aaa) -
我也想知道,如果使用像
{"ssid" : 1, "dim" : 2, "type" : 3, {"business_key" : {"xxx" : "abc", "yyy" : 1000, "zzz" : 123}}},{"ssid" : 1, "dim" : 2, "type" : 3, {"business_key" : {"xxx" : "abc", "yyy" : 1000, "zzz" : 123}}}这样的 JSON 会更简单
标签: c# asp.net json parsing azure-functions