Как я могу сериализовать динамический объект в JSON в действии контроллера C # MVC? - PullRequest
12 голосов
/ 12 августа 2011

Я хочу сериализовать динамический объект в 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?

Ответы [ 5 ]

6 голосов
/ 19 апреля 2014

У меня была такая же проблема, и я решил ее исправить, используя сериализатор 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 голосов
/ 28 июня 2012

Это может быть бесполезно для вас, но у меня было похожее требование, но я использовал SerializableDynamicObject

Я изменил имя словаря на «Поля», а затем сериализовал сJson.Net для создания json, который выглядит следующим образом:

  {"Fields":{"Property1":"Value1", "Property2":"Value2" etc.

, где Property1 и Property2 - это динамически добавленные свойства - т.е. словарные ключи

. Было бы идеально, если бы я мог избавиться от лишних ".Свойство Fields ", которое инкапсулирует остальные, но я обошел это ограничение.

2 голосов
/ 12 августа 2011

Это вернет то, что вы хотите.

public JsonResult Edit()
{   
    return Json(new {abc = "ABC"});
}
0 голосов
/ 18 марта 2014

Это сработало для меня отлично.Вы должны использовать 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;
    }
0 голосов
/ 08 апреля 2013

Вы всегда можете сериализовать HashTable, он не динамический, но поддерживает пары значений ключей объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...