我使用数据库来保存Json结构和值。使用Testdata将Structure作为Dictionary看起来与此类似:
Dictionary<string, string> input = new Dictionary<string, string>();
input.Add("application.shortName", "TestShortName");
input.Add("application.longName", "TestLongName");
input.Add("application.description", "TestDescription");
input.Add("application.deepNode.evenDeeperNode", "Values so deep, you can see Adelle rolling");
input.Add("common.yes", "YesTest");
input.Add("common.no", "NoTest");
input.Add("common.save", "SaveTest");
input.Add("common.pager.pagesLenghtBefore", "LengthTestDeepNode");
我从来不知道来自数据库的名称,所以它可以是键的任何名称和任何由点表示的深度:&#34; key1.key2.keyN&#34;。 现在我想将从数据库中获取的每个键和值序列化为Json。使用上面的Testdata,它看起来像这样:
{
"application": {
"shortName": "TestShortName",
"longName": "TestLongName",
"description": "TestDescription",
"deepNode": {
"evenDeeperNode": "Values so deep, you can see Adelle rolling"
},
"common": {
"yes": "YesTest",
"no": "NoTest",
"save": "SaveTest",
"pager": {
"pagesLengthBefore": "LengthTestDeepNode"
}
}
}
}
我使用的是JSON.NET,但我几乎没有表面,也不知道是否有方法。我知道我可以将字典转换为Json,但由于我的键的深度未知,这是不可能直接实现的。我试图想出一个循环来分割键并将值添加到最后一个分割节点,尽管我从来没有能够实际编写类似的东西。
我希望这看起来不是一个不恰当的问题,但我真的需要帮助。我很欣赏正确方向的任何提示。提前致谢
答案 0 :(得分:4)
您可以使用动态对象代替字典,例如:
var input = new {application = new {shortName = "TestShortName",
longName = "TestLongName"
....},
common = new {yes = "YesTest",
..........}
}
或使用ExpandoObject:
dynamic input = new System.Dynamic.ExpandoObject();
input.application = new System.Dynamic.ExpandoObject();
input.application.shortName = "TestShortName"
input.application.longName = "TestLongName"
.
.
.
input.application.deepNode.evenDeeperNode = "Values so deep, you can see Adelle rolling"
答案 1 :(得分:2)
如果您需要将字典转换为json,那么以下代码片段将为您完成:
var input = new Dictionary<string, string>();
input.Add("application.shortName", "TestShortName");
input.Add("application.longName", "TestLongName");
input.Add("application.description", "TestDescription");
input.Add("application.deepNode.evenDeeperNode", "Values so deep, you can see Adelle rolling");
input.Add("common.yes", "YesTest");
input.Add("common.no", "NoTest");
input.Add("common.save", "SaveTest");
input.Add("common.pager.pagesLenghtBefore", "LengthTestDeepNode");
var res = new Dictionary<string, Object>();
foreach(var pair in input)
{
var key = pair.Key;
var parts = key.Split('.');
var currentObj = res;
for (int i = 0; i < parts.Length-1; i++)
{
var property = parts[i];
if (!currentObj.Keys.Contains(property))
currentObj[property] = new Dictionary<string, Object>();
currentObj = (new Dictionary<string, Object>())currentObj[property];
}
currentObj[parts[parts.Length - 1]] = pair.Value;
}
var json = JsonConvert.SerializeObject(res, Formatting.Indented);