序列化由点分隔的字符串键,其值为Json

时间:2015-04-15 06:27:48

标签: c# json json.net

我使用数据库来保存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,但由于我的键的深度未知,这是不可能直接实现的。我试图想出一个循环来分割键并将值添加到最后一个分割节点,尽管我从来没有能够实际编写类似的东西。

我希望这看起来不是一个不恰当的问题,但我真的需要帮助。我很欣赏正确方向的任何提示。提前致谢

2 个答案:

答案 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);