gpt4 book ai didi

c# - JSON 将 JsonResult 转换为 javascript 字符串而不编码引号

转载 作者:太空狗 更新时间:2023-10-29 22:13:32 30 4
gpt4 key购买 nike

我需要使用 ASP.NET CoreMicrosoft.AspNet.Mvc.Controller.JsonResult 转换为字符串

这是我在 ASP.NET MVC 中的代码

public async Task<string> GetJsonData()
{
//...
var result = GetMyComplexObject();

//using Newtonsoft.Json.JsonConvert method
var jsonString = JsonConvert.SerializeObject(Json(result));
return jsonString;
}

public async Task<IActionResult> Index()
{
var myViewModel= new MyViewModel();
myViewModel.JsonString = GetJsonData();
return View(myViewModel);
}

public class MyViewModel
{
//...
public string JsonString { get; set; }
}

在我的 cshtml 中

var dataSet = {@(Model.JsonString))};

然而,在生成的源代码中,不是引号中的字段,而是 html 编码的,例如“字段1”

除了运行字符串替换之外,有没有更简洁的方法将 JsonResult 转换为 string

最佳答案

在 ASP.Net 5 中有一个 JsonHelper通过 @Json.Serialize 可直接在 razor View 中使用,因此您可以在 razor View 中编写如下内容:

var foo = @Json.Serialize(model);

这与手动操作非常相似:

var foo = @Html.Raw(JsonConvert.SerializeObject(model))

这两种情况下的问题是 JSON.Net 默认情况下会序列化但不会对输出进行 XSS 清理。这意味着 model 的内容不会被转义,让您的代码为 XSS attacks 打开如果模型取决于用户输入。例如:

@{
var model = new
{
prop1 = 1,
prop2 = "</script><script>alert('o hai');</script>",
prop3 = false
};
}
var foo = @Json.Serialize(model);

您可以使用允许您指定 JsonSerializerSettingsJson.Serialize 重载,这样您就可以设置 StringEscapeHandling作为 EscapeHtml:

HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped.

var foo = @Json.Serialize(model, new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml });

附言。我在 github 上提出了一个问题在 JsonHelper 中包含默认的 html 转义。

以前版本中使用的方法

如果你在堆栈溢出上搜索同样的问题,你会看到在早期版本的 MVC 中曾经有一个 Json.Encode 帮助程序,所以你可以序列化 like this ,手动执行 json 序列化。这似乎被默认情况下不安全的 Json.Serialize 取代。

过去也有一个帮助程序 HttpUtility.JavaScriptStringEncode 可用于手动编码 json 文字。这似乎在 ASP.Net 5 中作为 IJavaScriptStringEncoder 存在。唯一的问题是,当与 Newtonsoft.Json(ASP.Net 5 中的默认 json 格式化程序)结合使用时,它将对有效的 json 文字进行过多编码(如属性名称中的双引号)。然而,它会生成一个有效的字符串,可以在浏览器上使用 JSON.parse 进行解析(所以可能 this approach 也应该有效):

@inject Microsoft.Extensions.WebEncoders.IJavaScriptStringEncoder encoder;
...
var foo = JSON.parse("@encoder.JavaScriptStringEncode(JsonConvert.SerializeObject(model))");

另请注意,通过查看最新的源代码,IJavaScriptStringEncoder 将被替换为 RC2 中的 System.Text.Encodings.Web.JavaScriptEncoder

关于c# - JSON 将 JsonResult 转换为 javascript 字符串而不编码引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37255945/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com