2017-02-20 1 views
0

Ich habe eine Klasse:JSON.NET Serializer serialisiert falsch Zeichenfolge als boolean

[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 
     }; 
    } 
} 

und eine Steuerung, zB:

public HttpResponseMessage Post(int caseid, Guid id, UserPreferenceDTO prefs) 
{ ... } 

HINWEIS: Die Controller-Klasse ist dekoriert mit ein [CamelCaseControllerConfig] Attribut , das dies tut:

Auf dem Client Ich schicke ein Objekt wie folgt über:

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

Oft value ein JS boolean ist. Das Problem besteht darin, dass der Boolesche Wert, wenn er den Controller erreicht, in einen C# -Booleschen Wert () umgewandelt und mit einem String versehen wird.

Zum Beispiel

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

Senden wird:

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

in .NET-Controller.

Wenn Sie das Modell betrachten (UserPreferenceDTO) Definition Value dauert eine string. Warum konvertiert der Serializer den Wert in einen booleschen Wert?

würde ich viel lieber den Wert als "true"/"false" beibehalten werden, wenn sie gespeichert wird (was es einfacher machen würde, auf dem Client, auf eine boolean analysieren zurück, da JSON.parse("true") === true aber JSON.parse("True") !== true)

+1

Dies ist ein bisschen verwirrend.Sie sprechen davon, etwas wie '{name:" name ", value:" value "}' 'zu senden, aber dann sagen Sie, dass Sie' {"willColFit": "false"} 'senden. Schicken Sie das tatsächlich oder '{" name ":" wantColFit "," value ": false}'? Letzteres würde zu dem führen, was Sie sehen, würde ich erwarten. Ich bin mir nicht sicher, wie .NET '{" willColFit ":" false "}' in ein Objekt mit einem Name und einer Value-Eigenschaft eingruppiert ... –

+0

@MikeMcCaughan Sie sind völlig richtig. Editiert. – seebiscuit

Antwort

0

Json Boolean wird auf C# bool abgebildet. Da Ihr Feldname gleich ist und auf der C# -Seite ist es eine Zeichenfolge, die Bool in Zeichenfolge konvertiert wurde. Gemäß der Intermediate Language von .NEt wird der Wahrheitswert "true" in .Net "True".

Um dieses Problem zu lösen, müssen Sie entweder den booleschen Wert in Anführungszeichen übergeben oder müssen Ihre C# -Eigenschaft ändern.

string valueField = ""; 

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

Wert kann alles sein. Wie ein stringifiziertes Objekt/Array, usw. Ich kann den Getter nicht zu dem ändern, was Sie vorschlagen – seebiscuit

+0

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

0

konnte nicht herausfinden, wie (und warum) Json.Net wurde eine Zeichenfolge wie "true" zu einem C# boolean Deserialisieren True so gerade diesen Kern Ich lieh: BooleanConverter.js wo ReadJson tut:

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); 
    } 

und ich konnte mein Modell einen richtigen "true" oder "false" Wert serialisiert wird (statt "True" oder "False")

Wenn jemand antworte, was Json.Net intern tut, um die booleschen Zeichenketten zu erzeugen "true"/"false" Ich werde ihre Antwort akzeptieren.

Verwandte Themen