如何清理/压缩现有的 json 字符串?我见过使用正则表达式。还有其他(也许更有效)的方法吗?
Install-Package Newtonsoft.Json
只需解析它,然后序列化回 JSON:
var jsonString = " { title: \"Non-minified JSON string\" } ";
var obj = JsonConvert.DeserializeObject(jsonString);
jsonString = JsonConvert.SerializeObject(obj);
SerializeObject(obj, Formatting.None)
方法接受 Formatting
枚举作为第二个参数。您随时可以选择想要 Formatting.Indented
或 Formatting.None
。
使用 System.Text.Json 的非常基本的扩展方法
using System.Text.Json;
using static System.Text.Json.JsonSerializer;
public static class JsonExtensions
{
public static string Minify(this string json)
=> Serialize(Deserialize<JsonDocument>(json));
}
这利用了 JsonSerializerOptions 的默认值
JsonSerializerOptions.WriteIndented = false
如果您正在使用
System.Text.Json
那么这应该有效:
private static string Minify(string json)
{
var options =
new JsonWriterOptions
{
Indented = false,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
using var document = JsonDocument.Parse(json);
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream, options);
document.WriteTo(writer);
writer.Flush();
return Encoding.UTF8.GetString(stream.ToArray());
}
Encoder
选项不是必需的,但我最终采用了这种方式,这样角色就不会那么积极地转义。例如,使用默认编码器时,+
会替换为 \u002B44
。
对于我的用例,我正在缩小大型对象,大约 15k 个字符,具有相当深的层次结构。此问题的大多数现有答案都有效,并删除了大约 25% 的不必要字符。性能对我来说是一个问题,事实证明序列化然后反序列化似乎会增加大量开销。
我进行了一些相当粗略的测试:我记录了顺序缩小 100 万个对象所需的时间。公平地说,我没有监控内存使用情况。下面的代码完成这项工作的时间大约是下一个最佳选项的 60%:
using Newtonsoft.Json;
using System.IO;
public static string Minify(string json)
{
using (StringReader sr = new StringReader(json))
using (StringWriter sw = new StringWriter())
using (JsonReader reader = new JsonTextReader(sr))
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.None;
writer.WriteToken(reader);
return sw.ToString();
}
}
应得的信用,我的代码改编自这个答案
使用
System.Text.Json
这有效:
var jsonString = " { \n\r\t\"title\": \"Non-minified JSON string\"\n\r } ";
var minifiedJsonString = JsonNode.Parse(jsonString)?.ToJsonString();
Console.WriteLine(minifiedJsonString);
// Output {"title":"Non-minified JSON string"}
var minified = Regex.Replace ( json, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1" );
从这里找到:https://github.com/MatthewKing/JsonFormatterPlus/blob/master/src/JsonFormatterPlus/JsonFormatter.cs