【发布时间】:2014-12-30 23:08:34
【问题描述】:
假设我有以下 JToken:
@"{
""data"": [
{
""company"": {
""ID"": ""12345"",
""location"": ""Some Location""
},
""name"": ""Some Name""
}
]
}";
我想将此令牌传递给输出此 JToken 的 FlattenToken 函数:
@"{
""data"": [
{
""company_ID"": ""12345"",
""company_location"": ""Some Location"",
""name"": ""Some Name""
}
]}"
这样做的原因是我可以将扁平化的 JToken 反序列化为 DataTable。
不过,我迷失在一堆 JObject、JToken、JProperties 和其他 JMadness 中。我在this post 上看到了答案,这很有帮助,但我仍然没有做对。
这是我目前所拥有的:
public static JToken FlattenToken(JToken token)
{
foreach (JToken topLevelItem in token["data"].Children())
{
foreach (JToken field in topLevelItem.Value<JToken>())
{
foreach (JProperty property in field.Value<JObject>().Properties())
{
field.AddAfterSelf(JObject.Parse(@"{""" + property.Name + "_" + property.Value));
}
field.Remove();
}
}
return token;
}
通过外部foreach循环的第一次迭代,topLevelItem =
{
"company": {
"ID": "12345"
},
"name": "Some Name"
}
而第一次迭代通过第二个foreach循环,field =
"company": {
"ID": "12345"
}
到目前为止看起来不错。但是当我点击最里面的 foreach 循环时,我在 foreach 行上出现异常:“无法将 Newtonsoft.Json.Linq.JProperty 转换为 Newtonsoft.Json.Linq.JToken。”
不确定那里发生了什么。我的印象是 field.Value 调用将生成一个 JToken 并尝试将其转换为 JProperty。那么,正如错误所暗示的,JProperty 在哪里试图被强制转换为 JToken?
此外,这感觉像是一种将 JToken 扁平化的非常粗暴的方式。有没有更好的办法?
【问题讨论】: