牛顿软件。 json serializeObject 字符串包含小数值似乎没有正确转义
Posted
技术标签:
【中文标题】牛顿软件。 json serializeObject 字符串包含小数值似乎没有正确转义【英文标题】:newtonsoft. json serializeObject string contains fraction value doesn't seem to escape properly 【发布时间】:2020-08-22 00:50:01 【问题描述】:遇到一个问题,我的对象正在使用 Newton 进行序列化,其中一个属性是一个字符串,其中包含诸如 1/2"、1/4"等...
序列化后,我将变量传递给使用 OPENJSON 的 SQL Server 存储过程。
小数值中的双引号似乎没有正确转义,因为它作为 JSON 的无效格式失败。调试时,我看到下面会出现小数值中的 " 没有被正确转义。
对一些序列化有点新,所以可以使用一些帮助。
string strJson = JsonConvert.SerializeObject(myobject);
DECLARE @json nvarchar(max) = '"Number":64260,"Notes":"1/2\\" testing"';
SELECT *
FROM OPENJSON (@json, '$')
WITH(
[Number] int '$.Number'
,[Notes] nvarchar(max) '$.Notes'
) AS myDat
Msg 13609, Level 16, State 4, Line 2 JSON text is not properly formatted. Unexpected character 't' is found at position 32.
如果我从小数值中删除第二个“\”,它就可以正常工作。
public partial class TblEcr
public int Number get; set;
public string Notes get; set;
public JsonResult OnPostUpdate([DataSourceRequest] DataSourceRequest request, TblEcr ecr)
_context.TblEcr.Where(x => x.Number == ecr.Number).Select(x => ecr);
try
if (ModelState.IsValid)
string ecrJson = JsonConvert.SerializeObject(ecr);
var param = new SqlParameter[]
new SqlParameter()
ParameterName = "@json",
SqlDbType = System.Data.SqlDbType.VarChar,
Size = 8000,
Direction = System.Data.ParameterDirection.Input,
Value = ecrJson
,
new SqlParameter()
ParameterName = "@Status",
SqlDbType = System.Data.SqlDbType.Bit,
Direction = System.Data.ParameterDirection.Output
//,Value = 10
,
new SqlParameter()
ParameterName = "@ErrorDetails",
SqlDbType = System.Data.SqlDbType.VarChar,
Size =8000,
Direction = System.Data.ParameterDirection.Output,
;
int affectedRows = _context.Database.ExecuteSqlCommand("dbo.usp_UpdateECR @json, @Status, @ErrorDetails out", param);
catch (Exception ex)
return new JsonResult(ex.Message);
return new JsonResult(new[] ecr .ToDataSourceResult(request, ModelState));
【问题讨论】:
您能否在您的问题中添加足够的 C# 代码以生成该字符串作为 JSON.NET 序列化的结果? 更新问题。让我知道这是否足够。存储过程包含示例中使用的 SQL 语句 【参考方案1】:不适合我。
using Microsoft.Data.SqlClient;
using Newtonsoft.Json;
using System;
namespace ConsoleApp8
class Program
public partial class TblEcr
public int Number get; set;
public string Notes get; set;
static void Main(string[] args)
var ecr = new TblEcr() Number = 1, Notes = @"1/2"" testing" ;
string ecrJson = JsonConvert.SerializeObject(ecr);
Console.WriteLine(ecrJson);
输出
"Number":1,"Notes":"1/2\" testing"
【讨论】:
【参考方案2】:感谢您的关注。
经过深思熟虑后,我简化了我试图更新的记录并发现了我的问题。它是 SQL Server 中的存储过程。
导致问题的过程中存在字符串操作。基本上是用于其他目的的简单替换。
Set @json = REPLACE(@json,'\"','"'); -- BOOM, this caused it.
【讨论】:
很高兴您发现了问题。对 JSON 字符串执行替换始终是导致此类问题的危险信号。以上是关于牛顿软件。 json serializeObject 字符串包含小数值似乎没有正确转义的主要内容,如果未能解决你的问题,请参考以下文章