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对象,因为它使用了一个它不期望的类型。
太令人震惊了。有人有解决办法吗?如果不是,我就去找出如何在序列化时显示枚举名称而不是值。
所以答案显然是…你不能!
似乎不支持JsonPrimitive类型序列化对象。下面由Obi和Dan提供的答案帮助我进行了更多的研究,并发现XML序列化器实际上抛出了一个异常,而JSON序列化器只是吃掉它并输出一个空数组,这就是你上面看到的。
这里有很多正确答案。
- 自定义序列化器
- 以字符串形式输出JSON
- 返回自定义对象,然后围绕枚举等事情工作值
我相信还有其他人。
但是无论你做什么,都不要尝试使用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/xml
、application/json
等来指定格式。
默认的JSON序列化器在序列化简单的字符串属性(如Name
和Description
)时没有问题。
我建议你这样做
Dan在下面贴了一个类似的答案,所以让我试着解决你的另一个问题。要序列化枚举,我建议将其隐藏在一个公共字符串属性中,该属性将返回枚举的字符串值
。public class DataObject{
public MyEnum SomeEnumValue;
public string EnumValue{
get {
//..return SomeEnumValue string value
}
}
}
你可以从EnumValue中读取值,它应该被正确地序列化。