newtonsoft. json строка serializeObject, содержащая дробное значение, похоже, не сбегает - PullRequest
0 голосов
/ 07 мая 2020

Возникла проблема, когда мой объект сериализуется с использованием Newton, где одно из свойств представляет собой строку, содержащую дробные значения, такие как 1/2 ", 1/4" , et c ...

После сериализации я передаю переменную в SQL серверную хранимую процедуру, которая использует OPEN JSON.

Кажется, что двойные кавычки в значении дроби не экранируются должным образом, так как они не соответствуют формату JSON. При отладке я вижу ниже, что могло бы показаться, что "в дробном значении не экранировано должным образом.

Немного новичок в некоторых сериализациях, поэтому может понадобиться небольшая помощь. Если я удалю второй "\" из значения дроби, он будет работать нормально.

 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));
    }

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Спасибо, что посмотрели на это.

Поразмыслив над этим, я упростил запись, которую пытался обновить, и обнаружил свою проблему. Это хранимая процедура на SQL сервере.

В процедуре произошла манипуляция со строкой, которая вызвала проблему. В основном простая замена для другой цели.

Set @json = REPLACE(@json,'\"','"'); -- BOOM, this caused it.
0 голосов
/ 07 мая 2020

Не воспроизводится для меня.

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"}
...