MVC 4 ApiController没有正确地序列化System.Json.JsonObject

时间:2013-04-08 18:35:42

标签: c# .net json asp.net-mvc-4

所以我不熟悉使用MVC4,后端对象的序列化对我来说似乎很“神奇”,所以如果我这样做的方式不对,请告诉我。

然而,我的目标是构建一个简单的rest API并返回JSON。我想我会使用System.Json并返回JsonObject。为了这个问题,我已经简化了这个问题,但在我的实际问题中,对象要复杂得多。

这是我的控制器......

....

 public class ActionsController : ApiController
    {
        // GET api/actions
        public JsonObject Get()
        {
            JsonObject testObjet = new JsonObject();
            testObjet.Add("Name", "Test name");
            testObjet.Add("Description", "Test Description");

            return testObjet;

        }
....

我希望看到:

{"Name":"Test name","Description":"Test Description"}

相反,我看到了:

{"Name":[],"Description":[]}

当我返回一个JsonObject的字符串时,我实际上似乎得到了更好的结果,或者甚至只是返回对象本身,但它有枚举的例外,我想返回名称而不是数字值,这是导致我的JsonObject用于自定义。

有谁知道为什么会放弃价值观?

编辑: 因此,由于Dan的评论如下,我只是为了看到giggles看到XML序列化程序用JSON对象吐出的内容,我得到了以下异常......

“不希望输入数据合约名称为'JsonPrimitive:http://schemas.datacontract.org/2004/07/System.Json'的'System.Json.JsonPrimitive'。”

因此,您似乎无法序列化System.Json.JsonObject对象,因为它使用的是一种它不期望的类型。

这太令人震惊了。有没有人有解决方法?如果不是,我会在序列化而不是值时找出如何显示枚举名称。

3 个答案:

答案 0 :(得分:1)

所以答案显然是......你不能!

似乎不支持序列化对象的JsonPrimitive类型。 Obi和Dan在下面提供的答案帮助我更多地了解并发现XML序列化程序实际上抛出了一个异常,而JSON序列化程序只是简单地吃它并输出一个空数组,这就是你在上面看到的。

这里有许多正确答案。

  1. 制作您自己的自定义序列化工具
  2. 将JSON输出为字符串
  3. 返回自定义对象,然后解决Enum之类的问题 值
  4. 我相信还有其他人。

    但无论你做什么,都不要尝试使用System.Json作为ApiController中的返回,因为你会得到上面的结果。

答案 1 :(得分:0)

您不应强制您的WebApi调用使用像JSON这样的特定格式。 WebApi的一个功能是您可以将格式指定为请求的一部分。从Get调用返回一个对象,让WebApi引擎进行序列化和反序列化:

public class DataObject
{
    public string Name { get; set; }
    public string Description { get; set; }
}

public class ActionsController : ApiController
{
    // GET api/actions
    public DataObject Get()
    {
        var testObject = new DataObject
        {
            Name = "Test name",
            Description = "Test Description"
        };

        return testObject;
    }
}

您可以通过将Accept标题设置为application/xmlapplication/json等来指定格式。

默认的JSON序列化程序可以序列化NameDescription之类的简单字符串属性。

答案 2 :(得分:0)

我建议你这样做

<德尔>    // GET api / actions         公共对象Get()         {             //如果要返回特定类型,请新建强类型对象             //并相应地更改Action返回类型             var testObjet = new(){                              名称=“测试名称”,                              Description =“测试说明”                              };             return testObjet;         } 丹已在下面发布了类似的答案,所以让我试着解决你的另一个问题。要序列化枚举,我建议你将它隐藏在一个公共字符串属性中,该属性将返回枚举的字符串值,

public class DataObject{
    public MyEnum SomeEnumValue;
    public string EnumValue{
       get {
          //..return SomeEnumValue string value
        }
    }
}

然后,您可以从EnumValue读取值,该值应根据需要正确序列化。