我有一个班级:
[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
)
答案 0 :(得分:0)
Json Boolean将映射到C#bool。 由于您的字段名称相同,而在C#端,因此字符串bool已转换为字符串。 根据中间语言.NEt布尔值“true”将在.Net中变为“真”。
要解决此问题,您需要使用引号传递布尔值,或者需要更改C#属性。
string valueField = "";
[JsonProperty]
public string Value
{
get{
return valueField.ToLower();
}
set{
value = valueField;
}
}
答案 1 :(得分:0)
无法弄清楚Json.Net如何(以及为什么)将类似"true"
的字符串反序列化为C#boolean True
,所以我只是借用了这个要点:BooleanConverter.js其中{{ 1}}确实:
ReadJson
我能够将我的模型序列化为正确的 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var val = reader.Value.ToString().ToLower().Trim();
if (val == "true" || val == "false")
return val;
// If we reach here, we're pretty much going to throw an error so let's let Json.NET throw it's pretty-fied error message.
return new JsonSerializer().Deserialize(reader, objectType);
}
或"true"
值(而不是"false"
或"True"
)
如果有人能够回答Json.Net在内部做什么来投射类似布尔的字符串"False"
/ "true"
,我会接受他们的回答。