Как я могу сериализовать динамический объект для 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;
    }