c# - 如何序列化 List<object> 同时转义特殊字符?

标签 c# .net json

<分区>

我们有一个非常大的List<object>我们正在将其转换为 json 字符串,然后发送到存储过程。为了让这篇文章简单明了,假设对象看起来像这样:

public class Customer
{
    public string Name { get; set; }
}

其中一位客户是“Bob's Repair Shop”。当其中包含此值的列表被序列化时,它将包含以下内容:

{
    "Name": "Bob's Repair Shop"
}

没关系,直到我们要将此 json 发送到存储过程为止。当它到达那里时,单引号会引发错误(我理解)。

最初我们通过执行 .replace("'", "~") 来处理这个问题在 C# 代码中的 json 字符串上,然后在存储过程中执行相反的操作。这工作了一段时间。但是我们现在遇到的是我们拥有 List<> 的对象比这个小例子复杂得多,而且我们还要处理列表中的数十万条记录。当 json 字符串这么大时,.replace("'", "~")抛出 Out of Range异常(exception)。老实说,这 .replace("'", "~")无论如何,这种方法都是一种技巧。

我希望找到一种方法来序列化我们的 List<object>以在序列化过程中转义单引号的方式。这可能吗?如果是这样,怎么做到的?

编辑:

我本来就应该这么说的。对不起,我错过了。以下是存储过程如何接收 json 字符串:

ALTER PROCEDURE [dbo].[name_of_proc]
    @jsonString NVARCHAR(MAX)
AS

然后我们转换 @jsonString到表变量 OPENJSON

编辑 2:

如何调用 sp:

    public void UpdateBulk(List<object> myObject)
    {
        string json = Newtonsoft.Json.JsonConvert.SerializeObject(myObject);
        json.replace("'", "~");
        var dParam = new DynamicParameters();
        dParam.Add("@jsonString", json);
        QuerySP<myObject>("name_of_proc", dParam);
    }

    protected IEnumerable<T> QuerySP<T>(string storedProcedure, object param = null)
    {
        using (var db = this.Context)
        {
            var output = db.Query<T>(storedProcedure, param: param, commandType: CommandType.StoredProcedure,commandTimeout: 32767);
            return output;
        }
    }

编辑 3: 指向可能重复的线程询问如何更改它:

{"key" : "value"}

为此:

{'key' : 'value'}

这不是我要问的。我在问如何改变这个:

{
    "Name": "Bob's Repair Shop"
}

对此:

{
    "Name": "Bob\'s Repair Shop"
}

最佳答案

您可以添加自定义 JSON 转换器,以便在序列化发生时对单个 string 实例执行替换。这仍然使用 string.Replace,但此时所有字符串实例都应该很小。

public class EscapeQuotes : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var escapedValue = ((string)value).Replace("'", "\\'");
        writer.WriteValue(escapedValue);
    }
}

用法:

Customer myObject = new Customer() { Name = "Bob's repair shop" };
var output = JsonConvert.SerializeObject(myObject, new EscapeQuotes());

输出:

{"Name":"Bob\\'s repair shop"}

关于c# - 如何序列化 List<object> 同时转义特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57628349/

相关文章:

c# - 使用 Json.NET 序列化为 NDJSON

c# - 转换空字符引用 ToString()

PHP 如何点击一个 url 并下载它的 xml

c# - 在 Entity Framework Core 中使用什么 C# 类型来映射 MySql 的 POINT 数据类型?

c# - Linq to XML 通过查询子元素获取父元素属性值

.net - 从 WCF REST Web 服务返回包装在回调函数中的 JSON

c# - 虚拟方法在 C# 中如何工作?

javascript - HTML 完全删除并忽略我从 JSON 响应中得到的字符串中的控制字符

c# - 显示带有文化信息但不带格式的数字

c# - TFS 自定义构建模板 - 获取不带 Uri 的团队项目集合