Как я могу сериализовать динамический объект для JSON в действии С# MVC Controller?
Я хочу сериализовать динамический объект в JSON. Я попытался использовать ExpandoObject, но результат не в том, что мне нужно:
public JsonResult Edit()
{
dynamic o = new ExpandoObject();
((IDictionary<string,Object>)o)["abc"] = "ABC"; //or o.abc = "ABC";
return Json(o);
}
Я хочу, чтобы JSON выглядел следующим образом: { "abc": "ABC" }, но вместо этого он выглядит как {{ "Key": "abc", "Value": "ABC" }]
Очевидно, что ExpandoObject не будет делать, но могу ли я наследовать от DynamicObject и каким-то образом переопределить его методы для получения формата JSON, который я хочу?
Ответы
Ответ 1
Это может быть не полезно для вас, но у меня было аналогичное требование, но я использовал SerializableDynamicObject
Я изменил имя словаря на "Поля", а затем сериализует Json.Net для создания json, который выглядит так:
{"Fields":{"Property1":"Value1", "Property2":"Value2" etc.
где Property1 и Property2 являются динамически добавленными свойствами - то есть словарные ключи
Было бы идеально, если бы я мог избавиться от дополнительного свойства "Поля", которое инкапсулирует остальные, но я работал над этим ограничением.
Ответ 2
У меня была такая же проблема, и я решил ее исправить, используя сериализатор JSON.net(Newtonsoft.Json) вместо использования результата JsonContent. Затем он сериализовал мои динамические объекты с нормальными свойствами по сравнению с "ключевым" значением "странный список".
//In my usage I had a list of dynamic objects
var output = new List<dynamic>();
//Change this
return JsonContent(new {Error = errorMessage, Results = output});
//to this
return Content(JsonConvert.SerializeObject(new {Error = errorMessage, Results = output}));
Ответ 3
Это вернет вам то, что вы хотите.
public JsonResult Edit()
{
return Json(new {abc = "ABC"});
}
Ответ 4
Вы всегда можете сериализовать HashTable, его не динамический, но он поддерживает пары значений ключа объекта.
Ответ 5
Это сработало для меня отлично. Вы должны использовать Json.NET.
[HttpGet]
public string GetJson()
{
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
List<DataEntry> properties = new List<DataEntry>();
for (int i = 0; i < 10; i++)
{
properties.Add(new DataEntry { Column = "column" + i.ToString(), Value = "value" + i.ToString() });
}
list.Add(properties.ToDictionary(x => x.Column, y => y.Value));
string test = JsonConvert.SerializeObject(list);
return test;
}