1

所以我是使用 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 对象吐出什么,我得到了下面的异常......

“不应使用数据合同名称‘JsonPrimitive: http: //schemas.datacontract.org/2004/07/System.Json ’键入‘System.Json.JsonPrimitive’ 。”

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

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

4

3 回答 3

1

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

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

这里有任意数量的正确答案。

  1. 制作自己的自定义序列化程序
  2. 将 JSON 输出为字符串
  3. 返回自定义对象,然后解决诸如枚举值之类的问题

我确信还有其他人。

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

于 2013-04-08T21:54:57.653 回答
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等来指定格式。

Name默认的 JSON 序列化器在序列化简单的字符串属性(如和)时没有问题Description

于 2013-04-08T18:39:26.013 回答
0

我建议你这样做

// GET api/actions public object Get() { //如果要返回特定类型,则新建一个强类型对象 //并相应地更改 Action 返回类型 var testObjet = new (){ Name= "Test name",描述=“测试描述”}; 返回测试对象;}

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

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

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

于 2013-04-08T18:47:49.090 回答