JSON.NET序列化程序不正确地将字符串序列化为布尔值

时间:2017-02-20 21:00:36

标签: c# asp.net asp.net-web-api 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" }'

变为:

The boolean in <code>Value</code> is a stringified C# boolean

在.NET控制器中。

如果您查看模型(UserPreferenceDTO)定义Value需要string。那么为什么序列化器将值转换为布尔值呢?

我宁愿在保存时将值保留为"true" / "false"(这样可以更容易地解析回客户端上的布尔值,因为JSON.parse("true") === true但是JSON.parse("True") !== true

2 个答案:

答案 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",我会接受他们的回答。