Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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
C# 为什么JsonResult返回经过修改的Json(用\“quot”而不是“quot”)?_C#_Asp.net Mvc_Json_Serialization - Fatal编程技术网

C# 为什么JsonResult返回经过修改的Json(用\“quot”而不是“quot”)?

C# 为什么JsonResult返回经过修改的Json(用\“quot”而不是“quot”)?,c#,asp.net-mvc,json,serialization,C#,Asp.net Mvc,Json,Serialization,我在WebApi控制器中编写了以下操作: public JsonResult GetData() { _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var item = new Item(); item.GenerateData(); var jsonMediaTypeF

我在WebApi控制器中编写了以下操作:

public JsonResult GetData()
    {
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var item = new Item();
        item.GenerateData();

        var jsonMediaTypeFormatter = new JsonMediaTypeFormatter
            {
                UseDataContractJsonSerializer = true
            };


        var jsonSerializer = new JsonSerializer();

        var serializedData = jsonSerializer.Serialize(jsonMediaTypeFormatter, item);

        var jsonResult = new JsonResult
        {
            ContentType = "application/json",
            Data = serializedData,
            JsonRequestBehavior = JsonRequestBehavior.AllowGet,
        };

        return jsonResult;
    }
该行: var serializedData=jsonSerializer.Serialize(jsonMediaTypeFormatter,item)

将数据序列化为Json,因此我有:

{"Class":{"Valid":{"From":"\/Date(1363302000000+0100)\/","To":"\/Date(43017433200000+0100)\/"},"Code":3,"Id":3,"Name":"Class3"},
等等。。(不是完整的Json)

但是JsonResult返回的Json不同:

{"ContentEncoding":null,"ContentType":"application\/json","Data":"{\"Class\":{\"Valid\":{\"From\":\"\\\/Date(1363302000000+0100)\\\/\",\"To\":\"\\\/Date(43017433200000+0100)\\\/\"},\"Code\":3,\"Id\":3,\"Name\":\"Class3\"},
注意文本中的\。 为什么会这样?怎么改?我想不出来

EDITJsonSerializer JsonSerializer是我的助手类,它使用DataContractJsonSerializer将数据序列化为Json。其代码如下:

public class JsonSerializer
{
    public string Serialize<T>(MediaTypeFormatter formatter, T value)
    {
        // Create a dummy HTTP Content.
        Stream stream = new MemoryStream();
        var content = new StreamContent(stream);

        // Serialize the object.
        formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait();

        // Read the serialized string.
        stream.Position = 0;
        return content.ReadAsStringAsync().Result;
    }
}
公共类JsonSerializer
{
公共字符串序列化(MediaTypeFormatter格式化程序,T值)
{
//创建一个虚拟HTTP内容。
Stream=新的MemoryStream();
var内容=新的流内容(流);
//序列化对象。
WriteToStreamAsync(typeof(T),value,stream,content,null).Wait();
//读取序列化的字符串。
流位置=0;
返回content.ReadAsStringAsync().Result;
}
}

我想要的是它的执行结果——并且不被更改——返回给用户

JsonResult
已经将您放入
数据中的任何内容序列化为JSON

在设置
数据
之前,您的代码将手动序列化为JSON,这将导致输出包含一个双序列化对象(
首先手动序列化为JSON字符串,然后使用JSON规则再次序列化该字符串——正是这第二个序列化正在转义您的引号)

虽然从技术上讲,我们不能排除双重序列化是故意进行的,但您应该做的很可能是

var jsonResult = new JsonResult
    {
        ContentType = "application/json",
        Data = item,
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
    };
如果不想序列化两次,但需要手动序列化,请改用
ContentResult

return new ContentResult
       {
           ContentType = "application/json",
           Content = serializedData,
       };

JsonResult
已经将放入
数据中的任何内容序列化为JSON

在设置
数据
之前,您的代码将手动序列化为JSON,这将导致输出包含一个双序列化对象(
首先手动序列化为JSON字符串,然后使用JSON规则再次序列化该字符串——正是这第二个序列化正在转义您的引号)

虽然从技术上讲,我们不能排除双重序列化是故意进行的,但您应该做的很可能是

var jsonResult = new JsonResult
    {
        ContentType = "application/json",
        Data = item,
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
    };
如果不想序列化两次,但需要手动序列化,请改用
ContentResult

return new ContentResult
       {
           ContentType = "application/json",
           Content = serializedData,
       };

双引号被转义。这是预期和期望的行为-它使字符串(如保存JSON数据的字符串)不会提前关闭。

双引号被转义。这是预期和期望的行为-它保留字符串(如保存JSON数据的字符串)您为什么不使用内置的
Json()
方法为您构建结果对象呢

public JsonResult GetData()
{
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var item = new Item();
    item.GenerateData();

    return Json(item);
}
如果您需要详细控制序列化是如何完成的,您可以。该帖子还建议为您的控制器创建一个基类,该基类覆盖
Json()
方法,但我宁愿在
控制器上创建一个扩展方法
——一方面,这不会对控制器的基类提出任何要求,另一方面,如果需要,它也不会隐藏默认行为:

public static class ControllerExtensions
{
     public static JsonResult DataContractJson(this Controller ctrl, object data) {
         return new DataContractJsonResult { Data = data };
     }
}

(与上面的问题相同)似乎完全完成了您正在做的事情—选择一个可以处理数据协定属性的JSON序列化程序。

为什么不使用内置的
JSON()
方法,为您构建结果对象呢

public JsonResult GetData()
{
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var item = new Item();
    item.GenerateData();

    return Json(item);
}
如果您需要详细控制序列化是如何完成的,您可以。该帖子还建议为您的控制器创建一个基类,该基类覆盖
Json()
方法,但我宁愿在
控制器上创建一个扩展方法
——一方面,这不会对控制器的基类提出任何要求,另一方面,如果需要,它也不会隐藏默认行为:

public static class ControllerExtensions
{
     public static JsonResult DataContractJson(this Controller ctrl, object data) {
         return new DataContractJsonResult { Data = data };
     }
}

(与上面的问题相同)似乎完全完成了您正在做的事情-选择一个可以处理数据协定属性的JSON序列化程序。

我忘了添加。我需要使用DataContractJsonSerializer序列化数据。然后如何使用它序列化?很好,谢谢,但我仍然对结果不太满意(看编辑后的问题)@lukasz.pek:什么是
JsonSerializer
?我忘了添加。我需要用DataContractJsonSerializer序列化数据,然后如何用它序列化?很好,谢谢,但我仍然对结果不太满意(看编辑后的问题)@lukasz.pek:什么是
JsonSerializer