自定义 JsonConverter 不适用于 WebAPI 对象反序列化
Custom JsonConverter not working on WebAPI object deserialization
我有一个模型对象,我将其发送到浏览器并返回给我。我希望加密该对象中的 ID 值。我创建了一个自定义的 JsonConverter 来加密字符串然后解密它。
public class SecretItem
{
[JsonConverter(typeof(EncryptedIdConverter))]
public string Id { get; set; }
public string Name { get; set; }
}
这是我的 EncryptedIdConverter class
class EncryptedIdConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string encryptedValue = (string)value;
if (!string.IsNullOrWhiteSpace(encryptedValue))
encryptedValue = Encryption.EncryptString(encryptedValue);
serializer.Serialize(writer, encryptedValue);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string decryptedString = (string)reader.Value;
if (!string.IsNullOrWhiteSpace(decryptedString))
decryptedString = Encryption.DecryptString(decryptedString);
return decryptedString;
}
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
}
如果我尝试调用 JsonConvert.Serialization 函数,一切正常。
JsonConvert.SerializeObject(secretItem)
JsonConvert.DeserializeObject<SecretItem>([JSON secretItem]);
当我 return HttpActionResult Ok(secretItem)
... 浏览器也得到加密的 Id 字符串。
但是,当我 POST 将数据返回到我的控制器时,我的 webapi 方法没有得到解密 属性。它会跳过 JsonConverter。
public async Task<IHttpActionResult> Post(SecretItem secretItem)
{
// Not decrypted
var decryptedId = secretItem.Id;
}
为什么反序列化逻辑的工作方式与我的 WebAPI 中的序列化逻辑不同?我什至不知道从哪里开始调试。
我们正在使用 Newtonsoft.Json 10.0.0.0、MVC5、.NET Framework 4.6.1。
你好吗Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
它应该有效
也许你需要一个TypeConverter
模型绑定
When Web API calls a method on a controller, it must set values for the parameters, a process called binding
这叫做模型绑定
Post(SecretItem secretItem)
模型绑定使用 TypeConverter
JSON连载
这叫JSON连载
HttpActionResult Ok(secretItem)
JSON 序列化使用 JsonConverter
文档
更多
c# - Setting the default JSON serializer in ASP.NET MVC - Stack Overflow
c# - How to use Json.NET for JSON modelbinding in an MVC5 project? - Stack Overflow
事实证明代码运行正常。问题是在正在测试的 POST 上,内容类型没有设置为 "application/json"。因此,它没有使用 JsonNetFormatter,因此跳过了转换器。
设置 contentType 后,一切正常!
我有一个模型对象,我将其发送到浏览器并返回给我。我希望加密该对象中的 ID 值。我创建了一个自定义的 JsonConverter 来加密字符串然后解密它。
public class SecretItem
{
[JsonConverter(typeof(EncryptedIdConverter))]
public string Id { get; set; }
public string Name { get; set; }
}
这是我的 EncryptedIdConverter class
class EncryptedIdConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string encryptedValue = (string)value;
if (!string.IsNullOrWhiteSpace(encryptedValue))
encryptedValue = Encryption.EncryptString(encryptedValue);
serializer.Serialize(writer, encryptedValue);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string decryptedString = (string)reader.Value;
if (!string.IsNullOrWhiteSpace(decryptedString))
decryptedString = Encryption.DecryptString(decryptedString);
return decryptedString;
}
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
}
如果我尝试调用 JsonConvert.Serialization 函数,一切正常。
JsonConvert.SerializeObject(secretItem)
JsonConvert.DeserializeObject<SecretItem>([JSON secretItem]);
当我 return HttpActionResult Ok(secretItem)
... 浏览器也得到加密的 Id 字符串。
但是,当我 POST 将数据返回到我的控制器时,我的 webapi 方法没有得到解密 属性。它会跳过 JsonConverter。
public async Task<IHttpActionResult> Post(SecretItem secretItem)
{
// Not decrypted
var decryptedId = secretItem.Id;
}
为什么反序列化逻辑的工作方式与我的 WebAPI 中的序列化逻辑不同?我什至不知道从哪里开始调试。
我们正在使用 Newtonsoft.Json 10.0.0.0、MVC5、.NET Framework 4.6.1。
你好吗Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
它应该有效
也许你需要一个TypeConverter
模型绑定
When Web API calls a method on a controller, it must set values for the parameters, a process called binding
这叫做模型绑定
Post(SecretItem secretItem)
模型绑定使用 TypeConverter
JSON连载
这叫JSON连载
HttpActionResult Ok(secretItem)
JSON 序列化使用 JsonConverter
文档
更多
c# - Setting the default JSON serializer in ASP.NET MVC - Stack Overflow
c# - How to use Json.NET for JSON modelbinding in an MVC5 project? - Stack Overflow
事实证明代码运行正常。问题是在正在测试的 POST 上,内容类型没有设置为 "application/json"。因此,它没有使用 JsonNetFormatter,因此跳过了转换器。
设置 contentType 后,一切正常!