#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