【问题标题】:Convert dot notation to JSON将点表示法转换为 JSON
【发布时间】:2019-08-02 17:51:49
【问题描述】:

如何将点表示法转换为 json
点符号可以有任意深度

所有数据都是这样的:

Dictionary<string, string> data = new Dictionary<string, string>
{
    {"Company.Website", "Hjemmeside"},
    {"Company.TextHeaderPlaceholder", "Firmanavn"},
    {"Company.User.Manager.Repositories.CreateAsync.ArgumentNullException.InvalidCompanyId", "firma id fejl"},
    {"BookingSettings.HelpText", "Hjælpe tekst på webshop"},
    {"BookingSettings.OnGoingOrderValidation.Text", "Bestillings validering i gang"},
    {"BookingSettings.OnGoingOrderValidation.Created", "Oprettet"},
    {"BookingSettings.Url", "Kundelink til booking"}
};

Json 结果应该是:

{
  "Company": {
    "Website": "Hjemmeside",
    "TextHeaderPlaceholder": "Firmanavn",
    "Users": {
      "Managers": {
        "Repositories": {
          "CreateAsync": {
            "ArgumentNullException": {
              "InvalidCompanyId": "Can not create company user with out a company!"
            }
          }
        }
      }
    }
  },
  "BookingSettings": {
    "HelpText": "Hjælpe tekst på webshop",
    "OnGoingOrderValidation": {
      "Text": "Bestillings validering i gang",
      "Created": "Oprettet"
    },
    "URL": "Kundelink til booking"
  }
}

如何以简单的方式做到这一点?

【问题讨论】:

  • 到目前为止您尝试了什么? string.Split 呢?而且它看起来不像 Dictionary&lt;string, string&gt; ... 而不是 Dictionary&lt;string, object&gt; 其中 object 可以是 stringDictionary&lt;string, object&gt;
  • 在我看来只是一个类实例,其成员具有特定值。您是否尝试过简单地将 Company 对象序列化为 JSON?
  • 尝试澄清我正在尝试做的事情,我正在使用 Home.Somthing 只是递归任何深度
  • 它可以用 1 行 ... 完成,当然“BookingSettings.Url”不存在......
  • @Selvin 我写了一个solution,就像你建议的那样。自从我做了魔术 LINQ-to-JSON(使用 Newtonsoft.Json)以来已经有一段时间了,但这可能是可以使用的。否则自定义JsonConverter

标签: c# json converters


【解决方案1】:

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

public static Dictionary<string, object> DotNotationToDictionary(Dictionary<string, string> dotNotation)
{
    Dictionary<string, object> dictionary = new Dictionary<string, object>();

    foreach (var dotObject in dotNotation)
    {
        var hierarcy = dotObject.Key.Split('.');

        Dictionary<string, object> bottom = dictionary;

        for (int i = 0; i < hierarcy.Length; i++)
        {
            var key = hierarcy[i];

            if (i == hierarcy.Length - 1) // Last key
            {
                bottom.Add(key, dotObject.Value);
            }
            else 
            {
                if (!bottom.ContainsKey(key))
                    bottom.Add(key, new Dictionary<string, object>());
                
                bottom = (Dictionary<string, object>) bottom[key];
            }
        }
    }

    return dictionary;
}

完成后,您可以使用JsonConvert.SerializeObject(来自Newtonsoft.Json)将字典转换为 JSON:

Dictionary<string, string> dotNotation = new Dictionary<string, string>
{
    {"Company.Website", "Hjemmeside"},
    {"Company.TextHeaderPlaceholder", "Firmanavn"},
    {"Company.User.Manager.Repositories.CreateAsync.ArgumentNullException.InvalidCompanyId", "firma id fejl"},
    {"BookingSettings.HelpText", "Hjælpe tekst på webshop"},
    {"BookingSettings.OnGoingOrderValidation.Text", "Bestillings validering i gang"},
    {"BookingSettings.OnGoingOrderValidation.Created", "Oprettet"},
    {"BookingSettings.Url", "Kundelink til booking"}
};

var betterDictionary = DotNotationToDictionary(dotNotation);

var json = JsonConvert.SerializeObject(betterDictionary);

Console.WriteLine(json);

Here's a fiddle with it.

这是输出(格式化):

{
  "Company": {
    "Website": "Hjemmeside",
    "TextHeaderPlaceholder": "Firmanavn",
    "User": {
      "Manager": {
        "Repositories": {
          "CreateAsync": {
            "ArgumentNullException": {
              "InvalidCompanyId": "firma id fejl"
            }
          }
        }
      }
    }
  },
  "BookingSettings": {
    "HelpText": "Hjælpe tekst på webshop",
    "OnGoingOrderValidation": {
      "Text": "Bestillings validering i gang",
      "Created": "Oprettet"
    },
    "Url": "Kundelink til booking"
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多