C# JsonNamingPolicy.SnakeCaseLower 不起作用

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

我正在尝试将 json 字符串转换为对象,然后再次转换回字符串,以更改 json 格式。我这样做的原因是一个更长的故事,并且与 gRPC 重复字段有关。

现在这是一个片段,我希望将 json 字符串的大小写转换为蛇形大小写:

using System.Text.Json;

string json = "{\"MyImportantParameter\":\"MyContent\"}";

var obj = JsonSerializer.Deserialize<object>(json);

JsonSerializerOptions opts = new() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower };
string json2 = JsonSerializer.Serialize(obj, opts);

我已经尝试过摆弄选项,比如使用不同的选项进行反序列化,但无论我做什么,json 和 json2 都是相等的。

我在这里做错了什么?

c# naming-conventions system.text.json
1个回答
0
投票

谢谢@dbc 指出

PropertyNamingPolicy 只影响编译时的序列化 定义的属性[...]

现在我想出了这个作为我的解决方案:

public static class JsonHelper
{
    public static string? NormalizeJsonString(string jsonString, JsonSerializerOptions jsonSerializerOptions)
    {
        var jsonObject = JsonSerializer.Deserialize<JsonObject>(jsonString);

        if (jsonObject != null)
        {
            ApplyPropertyNamingPolicy(jsonObject, jsonSerializerOptions);
        }

        var result = JsonSerializer.Serialize(jsonObject, jsonSerializerOptions);

        return result;
    }

    public static void ApplyPropertyNamingPolicy(JsonObject jsonObject, JsonSerializerOptions jsonSerializerOptions)
    {
        if (jsonSerializerOptions.PropertyNamingPolicy == null)
            return;

        var dictionary = new Dictionary<string, JsonNode?>();
        foreach (var item in jsonObject)
        {
            var name = jsonSerializerOptions.PropertyNamingPolicy.ConvertName(item.Key);
            if (item.Value is JsonObject jsonSubObject)
            {
                ApplyPropertyNamingPolicy(jsonSubObject, jsonSerializerOptions);
            }
            else if (item.Value is JsonArray jsonArray)
            {
                foreach (var arrayItem in jsonArray)
                {
                    if (arrayItem is JsonObject arrayJsonObject)
                    {
                        ApplyPropertyNamingPolicy(arrayJsonObject, jsonSerializerOptions);
                    }
                }
            }
            dictionary[name] = item.Value;
        }

        jsonObject.Clear();

        foreach (var item in dictionary)
        {
            jsonObject.Add(item.Key, item.Value);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.