c# - 使用 JsonConvert 从 .Net 中的 JSON 中删除/替换换行符

标签 c# json json.net

我需要在序列化为 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);  

上面代码中的'value'是示例中提到的json。

最佳答案

可以修改ReplacingStringConverter的逻辑this answer running a transformation on a Json DeserializeObject for a property 在序列化字符串值时删除 \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 序列化两种类型化数据模型时工作。在 JToken 中捕获的自由格式 JSON层次结构。

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

演示 fiddle here .

关于c# - 使用 JsonConvert 从 .Net 中的 JSON 中删除/替换换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57987021/

相关文章:

c# - 无法在 OSX 上使用代码声明 ArrayList

javascript - 如何在 node.js 脚本中美化/美化 Json/JS 文件

ios - 提交表单时未使用表达式结果

.net - 如何让 Newtonsoft.Json 以我想要的方式序列化属性名称

c# - 从另一方收到不安全或不正确的安全故障

C# MVC4 - 将自定义类列表传回 Javascript

c# - 为什么我的 FlowDocument 不使用整个宽度?

javascript - json : "missing ] after element list" or just "undefined" 错误

json.net - JsonConverter 的 ReadJson 方法中的existingValue 参数有何用途?

c# - 将 JSON.NET 与 ExpandableObjectConverter 结合使用时出现问题