C# MVC 4 ApicController未正确序列化System.Json.JsonObject

C# MVC 4 ApicController未正确序列化System.Json.JsonObject,c#,.net,json,asp.net-mvc-4,C#,.net,Json,Asp.net Mvc 4,因此,我对使用MVC4还不熟悉,后端对象的序列化对我来说非常“神奇”,因此如果我用错误的方法进行了操作,请告诉我 然而,我的目标是构建一个简单的RESTAPI并返回JSON。我想我应该使用System.Json并返回JsonObject。为了这个问题,我简化了这个问题,但在我的真实问题中,对象要复杂得多 这是我的控制器 .... public class ActionsController : ApiController { // GET api/actions

因此,我对使用MVC4还不熟悉,后端对象的序列化对我来说非常“神奇”,因此如果我用错误的方法进行了操作,请告诉我

然而,我的目标是构建一个简单的RESTAPI并返回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或heck的字符串时,我实际上似乎得到了更好的结果,甚至只是返回对象本身,但它有枚举,我想返回名称而不是数字值,这正是导致我使用JsonObject进行自定义的原因

有人知道为什么它会降低值吗

编辑: 因此,由于Dan在下面的评论,我试着让大家咯咯地笑一下,看看XML序列化程序在JSON对象中输出了什么,我得到了下面的异常

不应使用数据协定名称为“JsonPrimitive:”的类型“System.Json.JsonPrimitive”

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


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

不应强制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
)时没有问题。您不应该强制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
)时没有问题。我建议您改为这样做

//获取api/操作 公共对象Get() { //如果要返回特定类型,请新建强类型对象 //并相应更改操作返回类型 var testObjet=new(){ Name=“测试名称”, Description=“测试描述” }; 返回测试对象; } Dan在下面发布了一个类似的答案,所以让我尝试解决您的另一个问题。要序列化枚举,我建议您将其隐藏在公共字符串属性中,该属性将返回枚举的字符串值

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

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

我建议您改为这样做

//获取api/操作 公共对象Get() { //如果要返回特定类型,请新建强类型对象 //并相应更改操作返回类型 var testObjet=new(){ Name=“测试名称”, Description=“测试描述” }; 返回测试对象; } Dan在下面发布了一个类似的答案,所以让我尝试解决您的另一个问题。要序列化枚举,我建议您将其隐藏在公共字符串属性中,该属性将返回枚举的字符串值

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

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

因此答案显然是。。。你不能

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

这里有很多正确答案

  • 创建自己的自定义序列化程序
  • 以字符串形式输出JSON
  • 返回自定义对象,然后处理枚举之类的问题 价值观
  • 我相信还有其他人


    但无论您做什么,都不要尝试在ApicController中使用System.Json作为返回,因为您将得到上面的结果

    所以答案显然是。。。你不能

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

    这里有很多正确答案

  • 创建自己的自定义序列化程序
  • 以字符串形式输出JSON
  • 返回自定义对象,然后处理枚举之类的问题 价值观
  • 我相信还有其他人


    但无论您做什么,都不要尝试在ApicController中使用System.Json作为返回,因为您将得到上面的结果

    好的,那太好了,谢谢你的提示,但是它仍然没有正确地序列化值,这就是问题所在。我想这里肯定还有其他的事情。我一直在使用这项技术,效果很好。您发布的序列化JSON似乎是
    Name
    Descr的结果