0

有一个问题,我的对象正在使用 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));
    }
4

2 回答 2

0

谢谢你看着它。

在考虑了更多之后,我简化了我试图更新的记录并发现了我的问题。它是 SQL Server 中的存储过程。

导致问题的过程中存在字符串操作。基本上是用于其他目的的简单替换。

Set @json = REPLACE(@json,'\"','"'); -- BOOM, this caused it.
于 2020-05-07T17:58:54.867 回答
0

不适合我。

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"}
于 2020-05-07T13:48:19.383 回答