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:
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
)
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 ... –
@MikeMcCaughan Sie sind völlig richtig. Editiert. – seebiscuit