в C # как сгенерировать тело JSON, имея ключ в виде строки и токен в виде строки, а ключ в виде строки и токен в виде списка

#c# #json #javascriptserializer

#c# #json #javascriptserializer

Вопрос:

Мне нужно сгенерировать следующий JSON, я пытался использовать JavaScriptSerializer, но я не могу найти решение, нужны рекомендации для достижения того же.

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

Я знаю, что это довольно просто, но я застрял на этом этапе уже довольно давно.

Ответ №1:

Вы можете попробовать использовать Dictionary, чтобы вы могли легко добавлять любые объекты к значению вашего словаря, как показано ниже;

 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-Редактировать: рассмотрите возможность использования динамического выражения, которое может иметь большие затраты на разрешение во время выполнения.

Надеюсь, это поможет.

Комментарии:

1. Я не могу реализовать решение для моего случая, как в случае: "taskProgress": [{ "message": "test message", "timeStamp": "date_time" }] , мое тестовое сообщение и date_time являются динамическими, также было бы полезно, если бы вы могли рассмотреть решение в контексте моего решения. Спасибо

2. Итак, я изменил свой ответ, а также создал рабочий пример, который соответствует 1: 1 с вашим образцом JSON @Sumit надеюсь, это было то, что вы ожидаете.

3. Спасибо Cihan за подробный ответ, это будет альтернативным решением моей проблемы, поскольку ранее я использовал JObject для построения моего ответа jSON, из-за которого, несмотря на то, что я смог создать список «taskProgress», когда я передавал его в JObject через add соответствующий параметр как JToken, это было невозможно.всегда в виде строки, что создавало проблемы. Но ваше решение работает для меня, так что еще раз спасибо. 🙂

Ответ №2:

Сделайте это

     [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 resu<
    }

      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