我希望能够使用CamelCasePropertyNameContractResolver,但对特定的属性名称重写它。为此,我使用JsonProperty属性。这很好,除非我选择的名字完全大写。有什么不对的地方吗?怎样才能避开它?
在下面的示例中,Bar在不使用CamelCasePropertyNameContractResolver时被序列化为"BAR",但在使用解析器时被序列化为"bar"。在这两种情况下,Foo和CamelCaseProperty都是正确序列化的。
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
namespace ConsoleTester
{
class Program
{
static void Main(string[] args)
{
var foo = new FooBar {CamelCaseProperty = "test", Foo = "test", Bar = "test" };
var output = JsonConvert.SerializeObject(foo);
// output "CamelCaseProperty", "fOO", "BAR"
var output2 = JsonConvert.SerializeObject(foo, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
// output "camelCaseProperty", "fOO", "bar"
}
}
public class FooBar
{
public string CamelCaseProperty { get; set; }
[JsonProperty("fOO")]
public string Foo { get; set; }
[JsonProperty("BAR")]
public string Bar { get; set; }
}
}发布于 2018-02-06 17:47:58
JsonProperty属性在使用ContractResolver时不被接受。
要解决这个问题,您可以做的是覆盖ContractResolver:
public class MyResolver : CamelCasePropertyNamesContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if(member.GetCustomAttribute<JsonPropertyAttribute>() is JsonPropertyAttribute jsonProperty)
{
property.PropertyName = jsonProperty.PropertyName;
}
return property;
}
}用你的救世主:
var output2 = JsonConvert.SerializeObject(foo, new JsonSerializerSettings { ContractResolver = new MyResolver() });https://stackoverflow.com/questions/48647650
复制相似问题