在C#中如何生成JSON主体,将键作为字符串,将令牌作为字符串,将键作为字符串,将令牌作为List

时间:2016-10-04 10:26:54

标签: c# json javascriptserializer

我需要生成以下JSON,我曾尝试使用JavaScriptSerializer,但我无法找到解决方案,需要指导才能实现相同的目标。

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

我知道它非常基本,但我现在很久以前就陷入困境。

2 个答案:

答案 0 :(得分: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-Edit:考虑使用动态表达式,这可能会在运行时解析上花费很多。

希望这有帮助。

答案 1 :(得分: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格式生成结果