我正在尝试将 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 都是相等的。
我在这里做错了什么?
谢谢@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);
}
}
}