我有一個類:JSON.NET串行不當序列化的字符串作爲布爾
[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
。那麼爲什麼序列化器將該值轉換爲布爾值?當它被保存(這將使它更容易解析返回給客戶端上的一個布爾值,因爲JSON.parse("true") === true
但JSON.parse("True") !== true
)
我寧願有值保留爲"true"
/"false"
這有點令人困惑。你說的是發送類似'{name:'name',value:'value'}'的東西,但是你說你正在發送'{「wantColFit」:「false」}'。你真的發送該或「{」名稱「:」wantColFit「,」值「:false}'?後者會導致你所看到的,我期望。我不確定.NET如何將'{「wantColFit」:「false」}解析爲具有名稱和值屬性的對象... –
@MikeMcCaughan您完全正確。 Editted。 – seebiscuit