首页 > 解决方案 > 使用 JsonConvert 从 .Net 中的 JSON 中删除/替换换行符

问题描述

在序列化为 JSON 时,我需要从一些字符串值中删除一些换行符——即在 c# 对象到 JSON 转换期间。如何才能做到这一点?

public static string ToJson(this object value)
{
  //Serializing C# Object to Json which gives me below mentioned JSON.
  return JsonConvert.SerializeObject(value);
}

下面是我的示例 JSON:

{
    "PolicyHolderInfo": {
        "ActionDate": "20190912",
        "EmployeeCode": "EPL2",
        "LocalEntityCode": "K",
        "PolicyHolderCode": "1YAAAAC",
        "Name1": "monoliability PDL\n",
        "Name2": "test\n",
        "Street1": "-",
        "Street2": "-",
        "City": "-",
        "PostCode": "-",
        "Subdivision": "01",
        "FMEPaymentFrequency1": "00",       
        "Reference": "C00-AAC"
    },
    "PolicyHolderTrailerInfo": {
        "RecordCode": "Z",
        "CountryCode": "KSA",
        "SourceIndicator": "EPLC",
        "RecordSequence": 0,
        "LinkNumber": 0,
        "RecordType": "Z",
        "ReturnCode": null,
        "Reference": "1-AC"
    },
    "SourceSystemDate": "2019-09-17T17:48:31.3543314+08:00"
}

Name1 和 Name2 有换行符 \n。我尝试了许多选项来删除那些\n。如果存在任何换行符,我只是尝试全局替换,而不是遍历每个值。以下选项均无效?

C#:

var str1 = JsonConvert.ToString(value);
var str2 = value.Replace(System.Environment.NewLine, string.Empty);
Regex regex_newline = new Regex("(\r\n|\r|\n)");
var str3 = regex_newline.Replace(value, "");
var str4 = value.Replace("\n", string.Empty);  

上面代码中的“值”是示例中提到的 json。

标签: c#jsonjson.net

解决方案


您可以修改ReplacingStringConverter从此答案的逻辑,以在 Json DeserializeObject 上运行转换,\n以便在序列化字符串值时删除字符。

首先,定义以下转换器:

public class ReplacingStringWritingConverter : JsonConverter
{
    readonly string oldValue;
    readonly string newValue;

    public ReplacingStringWritingConverter(string oldValue, string newValue)
    {
        if (string.IsNullOrEmpty(oldValue))
            throw new ArgumentException("string.IsNullOrEmpty(oldValue)");
        if (newValue == null)
            throw new ArgumentNullException("newValue");
        this.oldValue = oldValue;
        this.newValue = newValue;
    }

    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 bool CanRead { get { return false; } }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var s = ((string)value).Replace(oldValue, newValue);
        writer.WriteValue(s);
    }
}

然后您可以按如下方式序列化您的根数据模型:

var settings = new JsonSerializerSettings { Converters = { new ReplacingStringWritingConverter("\n", "") } };
var newJson = JsonConvert.SerializeObject(root, Formatting.None, settings); 

该转换器在序列化具有固定架构的类型化数据模型和在层次结构中捕获的LINQ to JSON自由格式 JSON 时工作。JToken

(顺便说一句,我相信你value.Replace()失败了,因为 JSON 字符串值实际上从不包含换行符。相反,正如JSON 标准所指定的,换行符必须替换为两个字符的转义序列\n。因此value.Replace("\n", string.Empty)失败,因为\n在你的code 是实际换行符的 c# 转义序列——它不存在。)

演示小提琴在这里


推荐阅读