2017-06-14 83 views
1

我有一個包含類似值的字符串堆棧:從堆棧創建JSON

catalog

catalogtype

catalogtypeoffer

catalogtypeactive

我希望得到一個JSON結構,如:

{ catalog: 
    { type: 
    { 
     offer: '', 
     active: '' 
    } 
    }, 
} 

我嘗試這樣的:

private static string BuildJsonStringFromStack(Stack<string> stack) 
    { 
     if (stack.Count == 1) 
     { 
      return $"{{{stack.Pop()}: {{}}}}"; 
     } 

     var json = new StringBuilder("{"); 
     var depth = stack.Count; 
     while (stack.Any()) 
     { 
      if (stack.Count == 1) 
      { 
       json.Append($"{stack.Pop()}: ''"); 
       json.Append(new String('}', depth)); 
      } 
      else 
      { 
       json.Append($"{stack.Pop()}: {{"); 
      } 
     } 
     return json.ToString(); 
    } 

這會給我喜歡的字符串:

{ catalog: 
    { type: 
    { 
     offer: '' 
    } 
    } 
} 

{ catalog: 
    { type: 
    { 
     active: '' 
    } 
    } 
} 

然而,當我試圖合併字符串到JObject,我不會同時得到offeractive作爲childre n的type - 最後一個處理將覆蓋另一個。

var jObject = JObject.Parse(BuildJsonStringFromStack(stack)); 
requestJson.Merge(jObject, new JsonMergeSettings 
{ 
    MergeArrayHandling = MergeArrayHandling.Merge 
}); 

有關如何獲得我想要的合併的任何想法?

+1

您可以創建在C#中的對象,它反映了數據的層次結構(如POCO)填充它類似於你的問題中的邏輯,然後將其轉換爲json。 – wahwahwah

+0

您可以使用ExpandoObjects重新結構(鑄造動態),然後將其序列化 – Gusman

+0

@Gusman良好的通話,我已經添加了一個答案與我的工作第一關。 –

回答

2

由於古斯曼的評論,這是很簡單的:

dynamic expando = new ExpandoObject(); 

foreach (var stack in stacks) 
{ 
    CreateExpando(expando, stack); 
} 
return JsonConvert.SerializeObject(expando); 

的呼叫:

private static void CreateExpando(ExpandoObject expando, Stack<string> stack) 
    { 
     var expandoDict = expando as IDictionary<string, object>; 
     var item = stack.Pop(); 

     ExpandoObject expandoRef = new ExpandoObject(); 
     if (!expandoDict.Keys.Contains(item)) { 
      expandoDict.Add(item, expandoRef); 
     } 
     else { 
      expandoRef = expandoDict[item] as ExpandoObject; 
     } 
     if (stack.Any()) 
     { 
      CreateExpando(expandoRef, stack); 
     }    
    }