所以我不熟悉使用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对象,因为它使用的是一种它不期望的类型。
这太令人震惊了。有没有人有解决方法?如果不是,我会在序列化而不是值时找出如何显示枚举名称。
答案 0 :(得分:1)
所以答案显然是......你不能!
似乎不支持序列化对象的JsonPrimitive类型。 Obi和Dan在下面提供的答案帮助我更多地了解并发现XML序列化程序实际上抛出了一个异常,而JSON序列化程序只是简单地吃它并输出一个空数组,这就是你在上面看到的。
这里有许多正确答案。
我相信还有其他人。
但无论你做什么,都不要尝试使用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/xml
,application/json
等来指定格式。
默认的JSON序列化程序可以序列化Name
和Description
之类的简单字符串属性。
答案 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读取值,该值应根据需要正确序列化。