私はこのようになりますJSONオブジェクトをデシリアライズするために、ニュートンJSONデシリアライザを使用しようとしています:文字列かintかのフィールドを持つJSONオブジェクトを逆シリアル化するベストプラクティスは何ですか?
{
"grades": 97
}
Or this:
{
"grades": ""
}
私は適切にこのオブジェクトを表現するためにC#でDTOクラスを定義する方法だろうか?ありがとう!
私はこのようになりますJSONオブジェクトをデシリアライズするために、ニュートンJSONデシリアライザを使用しようとしています:文字列かintかのフィールドを持つJSONオブジェクトを逆シリアル化するベストプラクティスは何ですか?
{
"grades": 97
}
Or this:
{
"grades": ""
}
私は適切にこのオブジェクトを表現するためにC#でDTOクラスを定義する方法だろうか?ありがとう!
dynamic
キーワードで試してみてください:
public class Rootobject
{
public dynamic grades { get; set; }
}
それはstring
とint
の両方で動作します。詳細はusing dynamic typeを参照してください。
UPDATE:次に
int
またはstring
に変換することがnull
値を処理し、入力drades
が正しくフォーマットされていない場合、私はより良いint
への変換を制御することができますので、int
のために、私はInt32.TryParse()
を使用しますので、私はConvert.ToString()
を使用します。 。
UPDATE:成績は "" である場合に
C#で任意のNULL可能なタイプがnull
になります。そのためにはint?
を使用できます。しかし、グレードが "3ds"のようなものなら、動的アプローチを使用する必要があります。
正しいタイプに変換する方法よりもどうすればいいですか? try-catchを実行時変換例外またはそれ以上のエレガントな方法でキャッチしますか?ありがとう! –
申し訳ありませんが、誤って回答を編集しましたが、無視してください。 –
@LifuHuang正しいタイプは何ですか? – kat1330
私はむしろ、オブジェクトではなくobject
またはdynamic
を使用して、あなたのコードベース全体の疑いでそのプロパティを処理するより、1つの予想タイプにデシリアライズされることを保証することになる、あなたのPOCOのカスタムJsonConverterを使用します。ここで
は、私はそれを行うだろう方法は次のとおりです。その後、
public class IntConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value.GetType() == typeof(int))
writer.WriteValue((int)value);
else
writer.WriteValue(value.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) =>
ParseInt(reader.Value.ToString());
public override bool CanConvert(Type objectType) =>
objectType == typeof(int) || objectType == typeof(string);
private static int ParseInt(string value)
{
int parsedInt = 0;
int.TryParse(value, out parsedInt);
return parsedInt;
}
}
そして、このようなあなたのPOCOでこのJsonConverterを使用します。
public class Student
{
[JsonProperty("grades"),
JsonConverter(typeof(IntConverter))]
public int Grades;
}
私は、これはこれらの事のための「ベストプラクティス」で見つけるだろう。
質問にマッチするには 'int? 'を使用するべきだと思います。 –
@ CyprienAutexier –
なぜ私は彼のユースケースから理解しているものから除外できるようにしたいのですか?あなたのDTOとコンバータ ""は0とみなされます。 –
あなたのクラスでGradesをObjectとして定義してみませんか? – NicoRiff
しかし、それは、デシリアライザが適切な型(intまたはstring)にグレードを内部的に正常に逆シリアル化してオブジェクトフィールドに割り当てることができるという事実に頼っていますか?それが起こるのだろうか? –
intは文字列を保持できませんが、文字列はintを保持できます。 – Will