假设我有一个基于 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.Parse
API 加载字符串时,它似乎将字符串保留原样:
[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);