将点表示法转换为 JSON

0 c# json converters

如何将点表示法转换为 json
\n点表示法可以有任何深度

\n\n

所有数据都是最新的,如下所示:

\n\n
Dictionary<string, string> data = new Dictionary<string, string>\n{\n    {"Company.Website", "Hjemmeside"},\n    {"Company.TextHeaderPlaceholder", "Firmanavn"},\n    {"Company.User.Manager.Repositories.CreateAsync.ArgumentNullException.InvalidCompanyId", "firma id fejl"},\n    {"BookingSettings.HelpText", "Hj\xc3\xa6lpe tekst p\xc3\xa5 webshop"},\n    {"BookingSettings.OnGoingOrderValidation.Text", "Bestillings validering i gang"},\n    {"BookingSettings.OnGoingOrderValidation.Created", "Oprettet"},\n    {"BookingSettings.Url", "Kundelink til booking"}\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

Json 结果应该是:

\n\n
{\n  "Company": {\n    "Website": "Hjemmeside",\n    "TextHeaderPlaceholder": "Firmanavn",\n    "Users": {\n      "Managers": {\n        "Repositories": {\n          "CreateAsync": {\n            "ArgumentNullException": {\n              "InvalidCompanyId": "Can not create company user with out a company!"\n            }\n          }\n        }\n      }\n    }\n  },\n  "BookingSettings": {\n    "HelpText": "Hj\xc3\xa6lpe tekst p\xc3\xa5 webshop",\n    "OnGoingOrderValidation": {\n      "Text": "Bestillings validering i gang",\n      "Created": "Oprettet"\n    },\n    "URL": "Kundelink til booking"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何用简单的方法做到这一点?

\n

Mik*_*der 12

我首先将其反序列化为嵌套字典。

\n
public static Dictionary<string, object> DotNotationToDictionary(Dictionary<string, string> dotNotation)\n{\n    Dictionary<string, object> root = new Dictionary<string, object>();\n\n    foreach (var dotObject in dotNotation)\n    {\n        var hierarcy = dotObject.Key.Split(\'.\');\n\n        Dictionary<string, object> current = root;\n\n        for (int i = 0; i < hierarcy.Length; i++)\n        {\n            var key = hierarcy[i];\n\n            if (i == hierarcy.Length - 1) // Last key\n            {\n                current.Add(key, dotObject.Value);\n            }\n            else \n            {\n                if (!current.ContainsKey(key))\n                    current.Add(key, new Dictionary<string, object>());\n                \n                current = (Dictionary<string, object>) current[key];\n            }\n        }\n    }\n\n    return root;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

完成后,您可以使用JsonSerializer.Serialize将字典转换为 JSON(JavaScriptEncoder.UnsafeRelaxedJsonEscaping“\xc3\xa6”所需):

\n
Dictionary<string, string> dotNotation = new Dictionary<string, string>\n{\n    {"Company.Website", "Hjemmeside"},\n    {"Company.TextHeaderPlaceholder", "Firmanavn"},\n    {"Company.User.Manager.Repositories.CreateAsync.ArgumentNullException.InvalidCompanyId", "firma id fejl"},\n    {"BookingSettings.HelpText", "Hj\xc3\xa6lpe tekst p\xc3\xa5 webshop"},\n    {"BookingSettings.OnGoingOrderValidation.Text", "Bestillings validering i gang"},\n    {"BookingSettings.OnGoingOrderValidation.Created", "Oprettet"},\n    {"BookingSettings.Url", "Kundelink til booking"}\n};\n\nvar betterDictionary = DotNotationToDictionary(dotNotation);\n\nvar json = JsonSerializer.Serialize(betterDictionary, new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });\n\nConsole.WriteLine(json);\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个摆弄它。

\n

这是输出:

\n
{\n  "Company": {\n    "Website": "Hjemmeside",\n    "TextHeaderPlaceholder": "Firmanavn",\n    "User": {\n      "Manager": {\n        "Repositories": {\n          "CreateAsync": {\n            "ArgumentNullException": {\n              "InvalidCompanyId": "firma id fejl"\n            }\n          }\n        }\n      }\n    }\n  },\n  "BookingSettings": {\n    "HelpText": "Hj\xc3\xa6lpe tekst p\xc3\xa5 webshop",\n    "OnGoingOrderValidation": {\n      "Text": "Bestillings validering i gang",\n      "Created": "Oprettet"\n    },\n    "Url": "Kundelink til booking"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n