Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据控制器设置json序列化程序选项(启动时不全局设置)?_Json_Asp.net Core_Asp.net Web Api - Fatal编程技术网

如何根据控制器设置json序列化程序选项(启动时不全局设置)?

如何根据控制器设置json序列化程序选项(启动时不全局设置)?,json,asp.net-core,asp.net-web-api,Json,Asp.net Core,Asp.net Web Api,上下文 我希望在ASP.NET核心控制器中返回JSON,并使用自定义的JsonSerializerOptions,而不是在Startup 我的控制器继承自ControllerBase,因此没有Json(…)方法,在这里我有机会传递自定义JsonSerializerOptions。(我错过了什么?) 没有问题有Ok(…)和etc帮助程序。但是,这些选项不支持作为传递参数的自定义选项 问题 作为一种解决方法,我可以手动创建一个JsonResult,并将数据序列化到其中,还可以设置http状态,但这是

上下文

我希望在ASP.NET核心控制器中返回JSON,并使用自定义的
JsonSerializerOptions
,而不是在
Startup

我的控制器继承自
ControllerBase
,因此没有
Json(…)
方法,在这里我有机会传递自定义
JsonSerializerOptions
。(我错过了什么?) 没有问题有
Ok(…)
和etc帮助程序。但是,这些选项不支持作为传递参数的自定义选项

问题

作为一种解决方法,我可以手动创建一个
JsonResult
,并将数据序列化到其中,还可以设置http状态,但这是最简单的方法吗


(如果您使用的是
Newtonsoft
System.Text.Json
只是共享,那么问题和答案是无关的。我打算使用
System.Text.Json

您可以使用
JsonSerializer
类将Json序列化为所需的设置,然后通过
Ok(serializedJson)

另一种方法是创建新的基本控制器类,其中包含Json帮助程序,然后可以从控制器中调用它们

public class BaseController : ControllerBase {
    protected internal JsonResult Json(object data)
    {
        return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
    }

    protected internal JsonResult Json(object data, string contentType)
    {
        return Json(data, contentType, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
    }

    protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding)
    {
        return Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
    }

    protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
    {
        return Json(data, null /* contentType */, null /* contentEncoding */, behavior);
    }

    protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
    {
        return Json(data, contentType, null /* contentEncoding */, behavior);
    }

    protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
    {
        return new JsonResult
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding,
            JsonRequestBehavior = behavior
        };
    }
}

谢谢在您的解决方案中,您正在序列化一个字符串,该字符串实际上包含json内容。这与序列化原始对象不同,例如,引号将是escapedI。此版本的Escape没有问题,无论如何,您可以使用第二种方法并使用原始Json()帮助程序。
public class BaseController : ControllerBase {
    protected internal JsonResult Json(object data)
    {
        return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
    }

    protected internal JsonResult Json(object data, string contentType)
    {
        return Json(data, contentType, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
    }

    protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding)
    {
        return Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
    }

    protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
    {
        return Json(data, null /* contentType */, null /* contentEncoding */, behavior);
    }

    protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
    {
        return Json(data, contentType, null /* contentEncoding */, behavior);
    }

    protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
    {
        return new JsonResult
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding,
            JsonRequestBehavior = behavior
        };
    }
}