如何在c# MVC控制器动作中序列化动态对象到JSON

本文关键字:序列化 动态 对象 JSON MVC 控制器 | 更新日期: 2023-09-27 18:05:30

我想将动态对象序列化为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格式,我想?

如何在c# MVC控制器动作中序列化动态对象到JSON

我有同样的问题,并最终通过使用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}));

这将返回你想要的。

public JsonResult Edit()
{   
    return Json(new {abc = "ABC"});
}

这可能对您没有用,但我有类似的需求,但使用了SerializableDynamicObject

我将字典的名称更改为"Fields",然后使用Json进行序列化。. Net生成json,如下所示:

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

其中Property1和Property2是动态添加的属性-即字典键

如果我能去掉封装其余部分的额外的"Fields"属性,那将是完美的,但我已经绕过了这个限制。

你总是可以序列化一个HashTable,它不是动态的,但它支持对象键值对

这对我来说非常有效。你必须使用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;
    }