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