可能な限りターゲットc#型文字列"4"
は整数に変換できるため、逆シリアル化は成功します。コンバータのような値を受け入れる
public class StrictIntConverter : JsonConverter
{
readonly JsonSerializer defaultSerializer = new JsonSerializer();
public override bool CanConvert(Type objectType)
{
return objectType.IsIntegerType();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
switch (reader.TokenType)
{
case JsonToken.Integer:
case JsonToken.Float: // Accepts numbers like 4.00
case JsonToken.Null:
return defaultSerializer.Deserialize(reader, objectType);
default:
throw new JsonSerializationException(string.Format("Token \"{0}\" of type {1} was not a JSON integer", reader.Value, reader.TokenType));
}
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
public static class JsonExtensions
{
public static bool IsIntegerType(this Type type)
{
type = Nullable.GetUnderlyingType(type) ?? type;
if (type == typeof(long)
|| type == typeof(ulong)
|| type == typeof(int)
|| type == typeof(uint)
|| type == typeof(short)
|| type == typeof(ushort)
|| type == typeof(byte)
|| type == typeof(sbyte)
|| type == typeof(System.Numerics.BigInteger))
return true;
return false;
}
}
注:この機能を使用しない場合は、読み込まれるトークンが実際に数値(またはnull
、NULL可能値のため)であることをチェックする整数型のためcustom JsonConverter
を作成することができます整数として4.00
。 JsonToken.Float
のチェックを削除して変更することができます。
public class RootObject
{
[JsonConverter(typeof(StrictIntConverter))]
public int id { get; set; }
public string name { get; set; }
}
を、またはすべての不可欠な分野に適用するJsonSerializerSettings
でコンバータが含まれています:
あなたは次のように直接あなたのモデルに適用することができます
var settings = new JsonSerializerSettings
{
Converters = { new StrictIntConverter() },
};
var root = JsonConvert.DeserializeObject<RootObject>(json, settings);
最後に
は、JSONシリアライザの設定を適用しますWeb APIではグローバルに、たとえばhereを参照してください。
出典
2017-01-21 20:57:57
dbc
これは、NewtonSoftなどのJSONシリアル化フレームワークによって提供される機能です。 JSONオブジェクトでは、everytingは文字列です。型変換を行うフレームワークです。 jsonの文字列に "id": "somestring"が含まれていると、間違いなくエラーが発生します。フレームワークは、JSON文字列値がターゲットタイプの形式である限り、型変換を実行しようとします。 –
"JSONオブジェクトでは、everytingは文字列です" ... ...うん?いいえ{"a":4}と{"a": "4"}は異なります。 "a"は1つのJSON番号ともう1つの文字列です。 JSONオブジェクトでは、すべてが文字列ではありません。プロパティは、文字列、数字、その他の文字、または配列です。 JSON型は非常に基本的なものなので、JSON配列を使用している場合は、それは問題ありません(JSON型は非常に基本的なので、数字として解析することができ、逆シリアル化された型は数値です)。 – Triynko