2017-02-26 149 views
1

在C#中我有一個像一本字典:C#字典鍵分裂爲JSON鍵值?

Dictionary<string,string> dict=new Dictionary<string,string>(); 
dict.Add("User.Info","Your info"); 
dict.Add("User.Profile","Profile"); 
dict.Add("Menu.System.Task","Tasks"); 
var output=dict??? 
return Json(output); 

而且我想改變的東西,如:

"User": { "Info": "Your info", "Profile": "Profile" }, "Menu": { "System": { "Task": "Tasks" } } } 

分割由圓點鍵,然後將其轉換成嵌套的鍵值對, 因爲我在做angular2的語言資源文件,並有什麼辦法實現這一點嗎?謝謝

回答

0

這裏是一種方式通過使用多個級別:

 Dictionary<string, object> dict = new Dictionary<string, object>(); 

     var user = new Dictionary<string, string>(); 
     user.Add("Info", "Your info"); 
     user.Add("Profile", "Profile"); 

     var menu = new Dictionary<string, object>(); 

     var system = new Dictionary<string, string>(); 
     system.Add("Task", "Tasks"); 

     menu.Add("System", system); 

     dict.Add("User", user); 
     dict.Add("Menu", menu); 

     string output = JsonConvert.SerializeObject(dict); 

     Console.WriteLine(output); 

輸出:

{ 「用戶」:{ 「信息」: 「你 信息」, 「檔案」: 「簡介」}, 「菜單」:{ 「系統」:{「任務「:」Tasks「}}}

p/s:您需要添加參考Newtonsoft.Json來運行此示例。參考鏈接:Serializing and Deserializing JSON

希望這有助於!

0

也許你可以看到有關「System.Dynamic.ExpandoObject」

+1

這應該是一個評論不是答案。 ! –

2

使用遞歸函數,你可以做到這一點,支持任意數量的「關鍵水平」的(任何數量的點)

功能:

private static void SetValues(string[] keys, int keyIndex, string value, IDictionary<string, object> parentDic) 
{ 
    var key = keys[keyIndex]; 

    if (keys.Length > keyIndex + 1) 
    { 
     object childObj; 
     IDictionary<string, object> childDict; 
     if (parentDic.TryGetValue(key, out childObj)) 
     { 
      childDict = (IDictionary<string, object>)childObj; 
     } 
     else 
     { 
      childDict = new Dictionary<string, object>(); 
      parentDic[key] = childDict; 
     } 

     SetValues(keys, keyIndex + 1, value, childDict); 

    } 
    else 
    { 
     parentDic[key] = value; 
    } 
} 

實施例:

Dictionary<string, string> dict = new Dictionary<string, string>(); 
dict.Add("User.Info", "Your info"); 
dict.Add("User.Profile", "Profile"); 
dict.Add("Menu.System.Task", "Tasks"); 
dict.Add("Menu.System.Configuration.Number", "1"); 
dict.Add("Menu.System.Configuration.Letter", "A"); 

var outputDic = new Dictionary<string, object>(); 

foreach (var kvp in dict) 
{ 
    var keys = kvp.Key.Split('.'); 
    SetValues(keys, 0, kvp.Value, outputDic); 
    } 

    var json = JsonConvert.SerializeObject(outputDic); 

輸出:

{ 
    "User": { 
    "Info": "Your info", 
    "Profile": "Profile" 
    }, 
    "Menu": { 
    "System": { 
     "Task": "Tasks", 
     "Configuration": { 
      "Number": "1", 
      "Letter": "A" 
     } 
    } 
    } 
} 
+0

偉大的,但最後我發現會有一個問題,就是每個人都必須有相同數量級的,前 dict.Add(「User.Profile」,「個人資料」); dict.Add(「User.Profile.Title」,「Your profile」); 這會發生錯誤,所以最後我刪除了所有的點,並使用簡單的字符串。 – protoss

+0

該結構在給定的例子中不會產生?你會想要一個屬性user.profile,其值爲「profile」,但也有一個屬性use.profile,它有一個值,如標題和「你的個人資料」的字典? – wdavo

2

您可以通過覆蓋JsonConverter中的WriteJson方法來實現。

class CustomJsonConverter : JsonConverter 
    { 

     public override bool CanConvert(Type objectType) 
     { 
      bool result = typeof(Dictionary<string,string>).IsAssignableFrom(objectType); 
      return result; 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      JObject jo = new JObject(); 

      foreach (var item in (Dictionary<string,string>)value) 
      { 
       if (item.Key.Contains(".")) 
       { 
        if (jo.Property(item.Key.Split('.')[0].ToString()) == null) 
        { 
         jo.Add(item.Key.Split('.')[0], 
           new JObject() { { item.Key.Split('.')[1], item.Value } }); 
        } 
        else 
        { 
         var result = jo.Property(item.Key.Split('.')[0].ToString()).Value as JObject; ; 
         result.Add(item.Key.Split('.')[1], item.Value); 
        } 
       } 
       else 
       { 
        jo.Add(item.Key, item.Value); 
       } 
      } 
      jo.WriteTo(writer); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

例子:

Dictionary<string, string> dict = new Dictionary<string, string>(); 
    dict.Add("User.Info", "Your info"); 
    dict.Add("User.Profile", "Profile"); 
    dict.Add("Menu.System.Task", "Tasks"); 

    JsonSerializerSettings obj = new JsonSerializerSettings(); 
    obj.Converters.Add(new CustomJsonConverter()); 

    var output1 = JsonConvert.SerializeObject(dict,obj); 

輸出:

{"User":{"Info":"Your info","Profile":"Profile"},"Menu":{"System":"Tasks"}}