2016-10-04 47 views
0

我需要生成下面的JSON,我試圖使用JavaScriptSerializer,但我無法找到解決方案,需要指導實現一樣。在C#中如何生成JSON正文,有鍵作爲字符串和標記作爲字符串和鍵作爲字符串和標記作爲列表

{ 
    "task": { 
     "taskState": "Running", 
     "taskStatus": "Ok", 
     "completedSteps": 1, 
     "taskProgress": [{ 
      "message": "test message", 
      "timeStamp": "date_time" 
     }] 
    } 
} 

我知道它非常基本,但是我從一段時間以來一直停留在這一點上。

回答

3

您可以嘗試使用字典,以便您可以輕鬆地將任何類型的對象添加到字典的值,如下所示;

Dictionary<string,object> myDict = new Dictionary<string,object>(); 
myDict.Add("StringList", new List<string>() { "string1", "string2" }); 
myDict.Add("Bool", false); 
myDict.Add("Int", 2016); 

改進答案:火柴給定樣本的Json

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SO_39849909 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<string, object> myDict = new Dictionary<string, object>(); 
      myDict.Add("task", new Dictionary<string, object>()); 

      Dictionary<string, object> innerDict = (myDict["task"] as Dictionary<string, object>); 
      innerDict.Add("taskState", "Running"); 
      innerDict.Add("taskStatus", "Ok"); 
      innerDict.Add("completedSteps", 1); 
      innerDict.Add("taskProgress", new List<dynamic>()); 

      List<dynamic> taskProgress = (innerDict["taskProgress"] as List<dynamic>); 
      taskProgress.Add(new { message = "test message", timeStamp = DateTime.Now }); 

      string json = JsonConvert.SerializeObject(myDict, Formatting.Indented); 
      Console.WriteLine(json); 
      Console.ReadLine(); 
     } 
    } 
} 

而且從dotnetfiddle工作的例子就是在這裏https://dotnetfiddle.net/ZYcZKp

然後你就可以序列化字典JSON。

PS:作爲一個建議,您可以考慮使用Newtonsoft.Json(https://www.nuget.org/packages/Newtonsoft.Json/

PS-編輯:考慮使用可能對運行時解決沉重代價的動態表達。

希望這會有所幫助。

+0

我無法實現我的情況的解決方案,在以下情況下:' 「taskProgress」:[{ 「消息」 :「test message」, 「timeStamp」:「date_time」 }]',我的測試消息和date_time是動態的,如果你能解決我解決方案中的解決方案,這也會有幫助。謝謝 – Sumit

+0

所以我修改了我的答案,並創建了一個工作示例,它與示例JSON @Sumit 1:1希望這是您的期望。 –

+0

感謝Cihan的詳細回覆,這將是我的問題的替代解決方案,因爲以前我使用JObject來構建我的jSON響應,儘管我可以創建「taskProgress」列表,當我通過它時JObject通過添加相應的參數作爲jToken,它總是作爲字符串,這是創建問題。但是你的解決方案正在爲我工​​作,所以再次感謝。 :) – Sumit

0

做這個

[WebMethod] 
    public static string data_call() 
    { 
     string result=""; 
     Data td=new Data(); 
     List<spselect_data_Result> selectdata=td.spselect_data().ToList(); 
     DataTable dt=new DataTable(); 
     dt.Columns.Add("RegValues",typeof(string)); 
     dt.Columns.Add("StartDate",typeof(DateTime)); 
     dt.Columns.Add("EndDate",typeof(DateTime)); 

     foreach(var add in selectdata) 
     { 
      dt.Rows.Add(add.RegValues,add.StartDate,add.EndDate); 
     } 
     result=DataSetToJSON(dt); 
     return result; 
    } 

     public static string DataSetToJSON(DataTable dt) 
    { 

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

     object[] arr = new object[dt.Rows.Count + 1]; 

     for (int i = 0; i <= dt.Rows.Count - 1; i++) 
     { 
      arr[i] = dt.Rows[i].ItemArray; 
     } 

     // dict.Add(dt.TableName, arr); 
     dict.Add("response", arr); 
     JavaScriptSerializer json = new JavaScriptSerializer(); 
     return json.Serialize(dict); 

    } 

DataSetToJSON JSON格式生成結果