牛顿软件。 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 字符串包含小数值似乎没有正确转义的主要内容,如果未能解决你的问题,请参考以下文章

NewtonSoft Json转换列表

牛顿法与拟牛顿法的区别与联系

A-03 牛顿法和拟牛顿法

牛顿法、拟牛顿法

第十一章 拟牛顿法

牛顿法与拟牛顿法 拟牛顿条件