(这是所有类型的背景,可以为您提供有关我的问题的背景信息。您可以跳到“问题”并阅读该内容,然后如果您想直截了当,可以返回并略读背景。抱歉,这是文字墙!)
我有一堆可怕的 JSON 需要存储在数据库中。本质上,有人使用 XML 的 XPath 将一个大的 XML 文件序列化为一个大的、扁平的 JSON 对象。这是我的意思的一个例子:
原始 XML:
<statistics>
<sample>
<date>2012-5-10</date>
<duration>11.2</duration>
</sample>
<sample>
<date>2012-6-10</date>
<duration>13.1</duration>
</sample>
<sample>
<date>2012-7-10</date>
<duration>10.0</duration>
</sample>
</statistics>
我必须使用的可怕 JSON:(基本上只是上面的 XPath)
{
"statistics":"",
"statistics/sample":"",
"statistics/sample/date":"2012-5-10",
"statistics/sample/duration":"11.2",
"statistics/sample@1":"",
"statistics/sample/date@1":"2012-6-10",
"statistics/sample/duration@1":"13.1",
"statistics/sample@2":"",
"statistics/sample/date@2":"2012-7-10",
"statistics/sample/duration@2":"10.0",
}
现在我需要把它放在一个数据库中,该数据库包含一个statistics
带有date
和duration
列的表。
我目前是如何做的:(或者至少是一个简单的例子)
Tuple<string, string>[] jsonToColumn = // maps JSON value to SQL table column
{
new Tuple<string, string>("statistics/sample/date", "date"),
new Tuple<string, string>("statistics/sample/duration", "duration")
};
// Parse the JSON text
// jsonText is just a string holding the raw JSON
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> json = serializer.DeserializeObject(jsonText) as Dictionary<string, object>;
// Duplicate JSON fields have some "@\d+" string appended to them, so we can
// find these and use them to help uniquely identify each individual sample.
List<string> sampleIndices = new List<string>();
foreach (string k in json.Keys)
{
Match m = Regex.Match(k, "^statistics/sample(@\\d*)?$");
if (m.Success)
{
sampleIndices .Add(m.Groups[1].Value);
}
}
// And now take each "index" (of the form "@\d+" (or "" for the first item))
// and generate a SQL query for its sample.
foreach (string index in compressionIndices)
{
List<string> values = new List<string>();
List<string> columns = new List<string>();
foreach (Tuple<string, string> t in jsonToColumn)
{
object result;
if (json.TryGetValue(t.Item1 + index, out result))
{
columns.Add(t.Item2);
values.Add(result);
}
}
string statement = "INSERT INTO statistics(" + string.Join(", ", columns) + ") VALUES(" + string.Join(", ", values) + ");";
// And execute the statement...
}
但是,我想使用 ADO.NET 实体数据模型(或类似 LINQ 的东西)而不是这种骇客,因为我需要在插入和应用一些更新之前开始执行一些查询,并创建和执行我自己的 SQL 语句只是……很麻烦。我创建了一个 ADO.NET 实体数据模型 (.edmx) 文件并进行了设置,现在我可以轻松地使用该模型与我的数据库进行交互和写入。
问题/问题
问题是我不确定如何最好地将我的 JSON 映射到我的 ADO.NET 实体数据模型Statistic
对象(代表表中的样本/记录statistics
)。最简单的方法是更改我的Tuple
列表以使用诸如指向成员的指针(Tuple<string, Statistic::*Duration>("statistics/sample/duration", &Statistic::Duration)
如果这是 C++ 的话,那就太好了),但是 a)我什至认为这在 C# 中是不可能的,并且 b)即使它是我Tuple
的都有不同的类型。
我在这里有哪些选择?如何最好地将 JSON 映射到我的Statistic
对象?我对 LINQ 世界有点陌生,我想知道是否有办法(通过 LINQ 或其他方式)映射这些值。
这是我所处的次优位置(使用如此糟糕的 JSON),我认识到考虑到我的情况,我目前的方法可能比其他任何方法都好,如果是这样的话,我什至会接受它作为我的回答。但我真的很想探索将这个 JSON 映射到 C# 对象(并最终映射到 SQL 数据库)的选项。