Không có thuộc tính để thực hiện việc này, nhưng bạn có thể thực hiện bằng cách tùy chỉnh trình phân giải.
Tôi thấy rằng bạn đã sử dụng a CamelCasePropertyNamesContractResolver. Nếu bạn dẫn xuất một lớp trình phân giải mới từ đó và ghi đè CreateDictionaryContract()phương thức, bạn có thể cung cấp một DictionaryKeyResolverhàm thay thế không thay đổi tên khóa.
Đây là mã bạn cần:
class CamelCaseExceptDictionaryKeysResolver : CamelCasePropertyNamesContractResolver
{
protected override JsonDictionaryContract CreateDictionaryContract(Type objectType)
{
JsonDictionaryContract contract = base.CreateDictionaryContract(objectType);
contract.DictionaryKeyResolver = propertyName => propertyName;
return contract;
}
}
Bản giới thiệu:
class Program
{
static void Main(string[] args)
{
Foo foo = new Foo
{
AnIntegerProperty = 42,
HTMLString = "<html></html>",
Dictionary = new Dictionary<string, string>
{
{ "WHIZbang", "1" },
{ "FOO", "2" },
{ "Bar", "3" },
}
};
JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new CamelCaseExceptDictionaryKeysResolver(),
Formatting = Formatting.Indented
};
string json = JsonConvert.SerializeObject(foo, settings);
Console.WriteLine(json);
}
}
class Foo
{
public int AnIntegerProperty { get; set; }
public string HTMLString { get; set; }
public Dictionary<string, string> Dictionary { get; set; }
}
Đây là kết quả từ phía trên. Lưu ý rằng tất cả các tên thuộc tính lớp đều có vỏ camel, nhưng các khóa từ điển vẫn giữ nguyên cách viết hoa ban đầu của chúng.
{
"anIntegerProperty": 42,
"htmlString": "<html></html>",
"dictionary": {
"WHIZbang": "1",
"FOO": "2",
"Bar": "3"
}
}