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

本文关键字:序列化 System Json JsonObject ApiController MVC | 更新日期: 2023-09-27 18:08:01

所以我刚开始使用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下面的评论,我只是想看看XML序列化器与JSON对象一起吐出了什么,我得到了下面的异常…

System.Json"类型"。数据合约名称为"JsonPrimitive:http://schemas.datacontract.org/2004/07/System.Json"的JsonPrimitive不被期望。"

所以看起来你不能序列化System.Json.JsonObject对象,因为它使用了一个它不期望的类型。

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

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

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

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

这里有很多正确答案。

  1. 自定义序列化器
  2. 以字符串形式输出JSON
  3. 返回自定义对象,然后围绕枚举等事情工作值

我相信还有其他人。

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

你不应该强迫你的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)时没有问题。

我建议你这样做

//获取api/actions公共对象Get(){//如果你想返回一个特定的类型,新建一个强类型对象//并相应地更改Action返回类型var testobject = new (){Name="测试名称",描述= "测试描述"};返回testObjet;}

Dan在下面贴了一个类似的答案,所以让我试着解决你的另一个问题。要序列化枚举,我建议将其隐藏在一个公共字符串属性中,该属性将返回枚举的字符串值

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

你可以从EnumValue中读取值,它应该被正确地序列化。