在.Net Core 3.1中使用NewtonSoft将DataTable转换为JSON字符串时如何使JSON字符串不包含'\u0022'或'\'等字符[重复]
Posted
技术标签:
【中文标题】在.Net Core 3.1中使用NewtonSoft将DataTable转换为JSON字符串时如何使JSON字符串不包含\'\\u0022\'或\'\\\'等字符[重复]【英文标题】:How to have JSON String without characters like '\u0022' or '\' while converting DataTable to JSON String using NewtonSoft in .Net Core 3.1 [duplicate]在.Net Core 3.1中使用NewtonSoft将DataTable转换为JSON字符串时如何使JSON字符串不包含'\u0022'或'\'等字符[重复] 【发布时间】:2020-09-04 08:06:54 【问题描述】:我正在.net core 3.1 中编写一个简单的 API。要将我的 DataTable 转换为 JSON 字符串,我使用 NewtonSoft Library 和以下代码:
string JSONresult = JsonConvert.SerializeObject(dt, Formatting.Indented);
return Json (new JSONresult );
我得到的输出是 JSON 字符串,但它有很多字符,例如 '\u0022' 我知道它是双引号。
"jsoNresult":"[\r\n \r\n \u0022ID\u0022: 2,\r\n \u0022FunctionalityName\u0022: \u0022User Upload\u0022,\r\n \u0022FunctionalityDescription\u0022: \u0022For Bulk Uploading User At Once\u0022,\r\n \u0022TableName\u0022: \u0022tablename\u0022,\r\n \u0022ValidationSP\u0022: \u0022user_Validate\u0022,\r\n \u0022InsertSP\u0022: \u0022Insert_User\u0022\r\n \r\n]"
我想要的只是:
"jsoNresult":"["ID": "2","FunctionalityName": "User Upload","FunctionalityDescription": "For Bulk Uploading User At Once","TableName": "tablename","ValidationSP": "user_Validate","InsertSP": "Insert_User"]"
我是 C# 新手,但之前曾在 Flask 甚至 Spring Boot 上工作过,它们返回清晰的 json 字符串。
那么我如何在 .net core 3.1 中实现我想要的。
PS:我知道Formatting.Indented
的用法,我可以有或没有它的序列化字符串
【问题讨论】:
您可以在 JSONresult 上执行.Replace
并将所有 "\u0022"
替换为 ""
阅读有关:How to serialize and deserialize (marshal and unmarshal) JSON in .NET 的文档,尤其是与非 ASCII 字符 处理 和编码有关的文档。
看起来你有一个 JSON 字符串,它本身编码一个 JSON 字符串(\u0022
是一个引号字符)。很有可能你应该只是return Json(new JSONresult = dt )
看起来您正在按照JSON.NET Parser seems to be double serializing my objects 的方式对JSON 进行双重序列化——也许System.Text.Json
不支持DataTable
?所以,不要那样做。如果您想在 ASP.NET Core 3.1 中使用 Json.NET,请参阅 Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0?。要在不替换序列化程序的情况下返回原始的序列化 JSON,请参阅Return “raw” json in ASP.NET Core 2.0 Web Api。
Invalid format with Json when converting DataTable with Json.Net的可能重复
【参考方案1】:
第一个线索是你的 JSON 字符串
"jsoNresult":"[\r\n \r\n \u0022ID\u0022: 2,\r\n \u0022FunctionalityName\u0022: \u0022User Upload\u0022,\r\n \u0022FunctionalityDescription\u0022: \u0022For Bulk Uploading User At Once\u0022,\r\n \u0022TableName\u0022: \u0022tablename\u0022,\r\n \u0022ValidationSP\u0022: \u0022user_Validate\u0022,\r\n \u0022InsertSP\u0022: \u0022Insert_User\u0022\r\n \r\n]"
看起来它包含一个 JSON 字符串:[\r\n \r\n \u0022ID\u0022
看起来很像 JSON,请记住 \u0022
是引号 "
字符(值为 0x22 的 ascii 字符是 "
)。
由此我们可以得出以下代码:
string JSONresult = JsonConvert.SerializeObject(dt, Formatting.Indented);
return Json (new JSONresult );
实际上是对 JSON 进行了两次编码。一次显然是JsonConvert.SerializeObject
,但另一个可能是Json
对象。
从这里可以清楚地看出Json
期望一个对象序列化,它会自己进行序列化。你不需要传递一个序列化的字符串。
支持by the documentation,上面写着:
创建一个将指定数据对象序列化为 JSON 的 JsonResult 对象。
那就试试吧:
return Json(new JSONresult = dt )
【讨论】:
您的回答有道理,但代码抛出“检测到不支持的可能对象循环。这可能是由于循环或对象深度大于允许的最大深度32”。这个错误 有趣,听起来像Json
发现了 Json.net 可以使用的东西。我假设您使用的是 asp.net core——如果是,您可以将其配置为使用 Json.net:see here
@elpidaguy 和其他所有人都因这个错误而绊倒:只需将new JsonSerializerSettings PreserveReferencesHandling = PreserveReferencesHandling.Objects, TypeNameHandling = TypeNameHandling.Objects, NullValueHandling = NullValueHandling.Ignore
添加到您的JsonConvert.SerializeObject()
方法中,错误就消失了。【参考方案2】:
尝试对序列化对象进行编码并检查它
string Encodedresult= HttpUtility.javascriptStringEncode(JSONresult))
【讨论】:
以上是关于在.Net Core 3.1中使用NewtonSoft将DataTable转换为JSON字符串时如何使JSON字符串不包含'\u0022'或'\'等字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 3.1 中使用 Java?
Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作