Upper case JSON keys



假设我有一个基于 JSON 的字符串,看起来:{"Hello":"1"}我想将其转换为看起来像{"HELLO":"1"}.

我创建了一个大写命名策略:

public class UpperCaseNamingStrategy : NamingStrategy
{
protected override string ResolvePropertyName(string name)
{
return name.ToUpper();
}
}

这在操作对象时有效:

[Fact]
public void TestUpperCase()
{
var thing = new {Hello = "1"};
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new UpperCaseNamingStrategy { OverrideSpecifiedNames = true }
}
};
var serializeObject = JsonConvert.SerializeObject(thing, jsonSerializerSettings);
Assert.Equal("{"HELLO":"1"}", serializeObject); // Works fine
}

但是当我通过JObject.ParseAPI 加载字符串时,它似乎将字符串保留原样:

[Fact]
public void TestUpperCase2()
{
var thing = JObject.Parse("{"Hello":"1"}");
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new UpperCaseNamingStrategy { OverrideSpecifiedNames = true }
}
};
var serializeObject = JsonConvert.SerializeObject(thing, jsonSerializerSettings);
Assert.Equal("{"HELLO":"1"}", serializeObject); // this fails Actual:   {"Hello":"1"}
}

在这个测试中,我正在模拟我的用例,我正在从 REST API 检索 JSON 响应,我正在尝试获取该响应字符串并将所有键转换为大写字符串。

做一些调试,我可以看到加载到 JObject 中的对象看起来像{{"Hello": "1"}}.

我只想指出,我使用的数据比简单的"hello"要复杂得多,我只是想要一个简单的例子,假设我有 20 个字段,有些是对象,有些是数组,有没有一种简单的方法我可以解析 JSON 并拥有使用大写命名的所有键。

我决定解决这个问题的方法是创建一个 POCO(普通的旧 c 对象(来存储来自 API 响应的信息:

public class Poco 
{
public string Hello {get;set;}
}

当我想大写时,所有属性键都使用我的大写命名策略通过序列化发送它:

var responseModel = JsonConvert.DeserializeObject<TResponse>(data);
return JObject.Parse(JsonConvert.SerializeObject(responseModel, 
new  JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore,
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new UpperCaseNamingStrategy
{
OverrideSpecifiedNames = true
}
}
}));

我希望有一种更通用的方法可以做到这一点,但这似乎是一个明智的解决方案

因此,如果有人仍然试图弄清楚:

声明命名策略

public class UpperCaseNamingPolicy : JsonNamingPolicy
{
public override string ConvertName(string name) => name.ToUpper();
}

在控制器中:

using System.Text.Json;
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = new UpperCaseNamingPolicy(),
WriteIndented = true
};
return Json(result, options);

最新更新