【发布时间】:2017-02-20 21:00:35
【问题描述】:
我有一堂课:
[JsonObject(MemberSerialization.OptIn)]
public class UserPreferenceDTO
{
[JsonProperty]
public string Name { get; set; }
[JsonProperty]
public string Value { get; set; }
public static explicit operator UserPreferenceDTO(UserPreference pref)
{
if (pref == null) return null;
return new UserPreferenceDTO
{
Name = pref.Name,
Value = pref.Value
};
}
public static explicit operator UserPreference(UserPreferenceDTO pref)
{
if (pref == null) return null;
return new UserPreference
{
Name = pref.Name,
Value = pref.Value
};
}
}
还有一个控制器,例如:
public HttpResponseMessage Post(int caseid, Guid id, UserPreferenceDTO prefs)
{ ... }
注意:控制器类装饰有[CamelCaseControllerConfig] 属性
这是做什么的:
public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
{
var formatter = controllerSettings.Formatters.OfType<JsonMediaTypeFormatter>().Single();
controllerSettings.Formatters.Remove(formatter);
formatter = new JsonMediaTypeFormatter
{
SerializerSettings = { ContractResolver = new CamelCasePropertyNamesContractResolver() }
};
controllerSettings.Formatters.Add(formatter);
}
在客户端我通过这样的对象发送:
{ name: "name", value: "Some value" }
value 通常是一个 JS 布尔值。问题是当它到达控制器时,布尔值被转换为 C# 布尔值 (True/False) 并被字符串化。
例如发送
'{ "name": "wantColFit", "value": "false" }'
变成:
在 .NET 控制器中。
如果您查看模型 (UserPreferenceDTO) 定义,Value 采用 string。那么为什么序列化器将值转换为布尔值呢?
我更希望在保存时将值保留为"true"/"false"(这将更容易在客户端解析回布尔值,因为JSON.parse("true") === true 但JSON.parse("True") !== true)
【问题讨论】:
-
这有点令人困惑。你说要发送
{ name: "name", value: "value" }之类的东西,但你说你要发送{ "wantColFit": "false" }。你实际上是发送那个还是{ "name": "wantColFit", "value": false }?我希望后者会导致您所看到的。我不确定 .NET 如何将{ "wantColFit": "false" }解析为具有 Name 和 Value 属性的对象... -
@MikeMcCaughan 你完全正确。已编辑。
标签: c# asp.net asp.net-web-api json.net