使用 .NET 缩小 json 字符串

问题描述 投票:0回答:6

如何清理/压缩现有的 json 字符串?我见过使用正则表达式。还有其他(也许更有效)的方法吗?

.net json minify
6个回答
16
投票
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


10
投票

使用 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

1
投票

如果您正在使用

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


0
投票

对于我的用例,我正在缩小大型对象,大约 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();
    }
}

应得的信用,我的代码改编自这个答案


0
投票

使用

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"}

-1
投票
var minified = Regex.Replace ( json, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1" );

从这里找到:https://github.com/MatthewKing/JsonFormatterPlus/blob/master/src/JsonFormatterPlus/JsonFormatter.cs

© www.soinside.com 2019 - 2024. All rights reserved.