2017-02-20 4 views
0

として文字列をシリアライズ: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]属性 これを行う:

10は、クライアント上で私はこのようなオブジェクトの上送信しています:

{ name: "name", value: "Some value" } 

しばしばvalueは、JSのブール値です。問題は、コントローラに到達するとブール値がC#ブール値(True/False)に変換され、文字列化されることです。

'{ "name": "wantColFit", "value": "false" }' 

を送信例えば

は、次のようになる。.NETコントローラ内

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

モデル(UserPreferenceDTO)の定義Valueを見ると、となります。では、なぜシリアライザは値をブール値に変換していますか? (JSON.parse("true") === trueしかしJSON.parse("True") !== trueいるので、それが簡単にクライアント上のブールに戻って解析することになるだろうどの)保存されたとき、私はむしろ価値を持っているでしょう

"true"/"false"として保存すること

+1

これはちょっと混乱します。あなたは '{name:" name "、value:" value "}'のようなものを送ることについて話しますが、あなたは '{" wantColFit ":" false "}'を送ります。あなたは実際にそれを送信しますか?{"name": "wantColFit"、 "value":false} '?後者は、あなたが見ているものになるでしょう、私は期待しています。私は.NETが '{" wantColFit ":" false "}'をNameとValueプロパティを持つオブジェクトにどのように解析するのかよくわかりません... –

+0

@MikeMcCaughanあなたは完全です。 Editted。 – seebiscuit

答えて

0

JSONブール値になりますC#boolにマップされます。 フィールド名は同じで、C#側では文字列であり、boolは文字列に変換されています。 中間言語.NEtブール値 "true"は.Netで "True"になります。

この問題を解決するには、ブール値を引用符で渡すか、C#プロパティを変更する必要があります。

string valueField = ""; 

[JsonProperty] 
public string Value 
{ 
    get{ 
     return valueField.ToLower(); 
    } 
    set{ 
     value = valueField; 
    } 
} 
+0

値は何でもかまいません。文字列化されたオブジェクト/配列などのように、私はあなたが提案したものにゲッターを変更することはできません – seebiscuit

+0

return valueField == "True" || valueField == "False"?valueField.ToLower():valueField; – Kalyan

0

は(も理由)Json.Netはので、私はちょうどこの主旨を借りC#のブールTrue"true"のような文字列をデシリアライズされた方法を見つけ出すことができませんでした:ReadJsonが行うBooleanConverter.js

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"または"False"

誰もが可能であればブール型の文字列をキャストするためにJson.Netが内部で行っていることに答えてください。"true"/"false"私は答えを受け入れます。

関連する問題