如何在C# MVC Controller操作中将动态对象序列化为JSON?

14

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


2
答案是根据以下链接展开:https://dev59.com/Nm435IYBdhLWcg3w4UWs - Joe
@JoeTuskan 顺便说一句,投票关闭这样的东西是值得的。 - Ruben Bartelink
5个回答

8

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

请考虑将您的答案复制到 https://dev59.com/Nm435IYBdhLWcg3w4UWs。 - ProfNimrod

3

这将返回您想要的内容。

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

3
这是一个具有 abc 属性的类。我希望在运行时添加属性到这个类中。 - panpawel

3
这可能对您没有用,但我有一个类似的需求,但是使用了SerializableDynamicObject。我将字典的名称更改为“Fields”,然后使用Json.Net进行序列化,生成的json如下:
  {"Fields":{"Property1":"Value1", "Property2":"Value2" etc.

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

如果我能摆脱额外的“Fields”属性并封装其余部分,那就太完美了,但我已经解决了这个限制。


1
你能把这个问题转移到https://dev59.com/Nm435IYBdhLWcg3w4UWs并且投票关闭吗?我甚至会在交易中加上一个+1 :D - Ruben Bartelink

0

这对我完美地起作用了。你必须使用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

您可以随时序列化一个HashTable,它虽然不是动态的,但支持对象键值对。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接