【问题标题】:.NET 6 - Change Json Property Casing.NET 6 - 更改 Json 属性外壳
【发布时间】:2022-01-11 12:08:22
【问题描述】:

如何在不执行模型绑定的情况下更改 json 属性名称的大小写? JsonElement 序列化忽略 PropertyNaming JsonSerializer 选项,这里也确认:https://github.com/dotnet/runtime/issues/61843 建议使用 JsonNode/JsonObject 会导致相同的行为。

任何提示我可以如何做到这一点?

例如,我想改变这个:

{
    "MyPoperty" : 5,
    "MyComplexProperty" : {
        "MyOtherProperty": "value",
        "MyThirdProperty": true
    }
}

到这里:

{
    "myPoperty" : 5,
    "myComplexProperty" : {
        "myOtherProperty": "value",
        "myThirdProperty": true
    }
}

干杯。

【问题讨论】:

  • 好像你的问题在这里已经有了答案:stackoverflow.com/questions/58570189/…
  • 否 - 该解决方案需要模型绑定。序列化 JsonElements 时,序列化不考虑命名策略或自定义转换器。

标签: json .net system.text.json .net-6.0 camelcasing


【解决方案1】:

我认为你尝试使用Newtonsoft json

class Person
{
    public string UserName { get; set; }
    public int Age { get; set; }
}

编码

static void Main(string[] args)
{
    Person person = new Person();
    person.UserName = "Bob";
    person.Age = 20;

    var serializerSettings = new JsonSerializerSettings();
    serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    var json = JsonConvert.SerializeObject(person, serializerSettings);
    Console.WriteLine(json);
}

输出

{"userName":"Bob","age":20}

【讨论】:

  • 有没有办法用新的 System.Text.Json 代替?
  • 除此之外没有更好的解决方案了。
  • 对了,我需要一个没有模型绑定的解决方案。通过模型绑定,它可以在 NewtonSoft 和 System.Text.Json 中使用。
  • 我尝试使用NewtonSoft直接解析字符。
  • 或许还有办法实现,但比较麻烦
【解决方案2】:

不依赖于Newtonsoft json ,而是在多层对象的情况下

var json = @"{""ShouldWindUpAsCamelCase"":""does it?""}";
var obj = JsonSerializer.Deserialize<Dictionary<string,string>>(json);
var dic = new Dictionary<string, string>();
foreach (var item in obj)
{
    dic.Add(item.Key.FirstCharToLower(), item.Value);
}
var serialized = System.Text.Json.JsonSerializer.Serialize(dic);
Console.WriteLine(serialized);

FirstCharToLower() 函数

 public static string FirstCharToLower(this string input)
        {
            if (String.IsNullOrEmpty(input))
                return input;
            string str = input.First().ToString().ToLower() + input.Substring(1);
            return str;
        }

#输出

{"shouldWindUpAsCamelCase":"does it?"}

【讨论】:

  • 感谢您的建议,但这也行不通。这基本上绑定到平面字典。所以它不允许复杂的对象。毕竟我确实找到了解决方案,但它远非理想:stackoverflow.com/questions/57263017/… - 使用 newtonsoft 和 expandoObject。
  • 好吧,让我尝试更多的方法,我会告诉你的
猜你喜欢
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
相关资源
最近更新 更多