2017-02-17 12 views
3

私はこのようになりますJSONオブジェクトをデシリアライズするために、ニュートンJSONデシリアライザを使用しようとしています:文字列かintかのフィールドを持つJSONオブジェクトを逆シリアル化するベストプラクティスは何ですか?

{ 
    "grades": 97 
} 

Or this: 

{ 
    "grades": "" 
} 

私は適切にこのオブジェクトを表現するためにC#でDTOクラスを定義する方法だろうか?ありがとう!

+1

あなたのクラスでGradesをObjectとして定義してみませんか? – NicoRiff

+0

しかし、それは、デシリアライザが適切な型(intまたはstring)にグレードを内部的に正常に逆シリアル化してオブジェクトフィールドに割り当てることができるという事実に頼っていますか?それが起こるのだろうか? –

+0

intは文字列を保持できませんが、文字列はintを保持できます。 – Will

答えて

5

dynamicキーワードで試してみてください:

public class Rootobject 
{ 
    public dynamic grades { get; set; } 
} 

それはstringintの両方で動作します。詳細はusing dynamic typeを参照してください。

UPDATE:次に

intまたはstringに変換することがnull値を処理し、入力dradesが正しくフォーマットされていない場合、私はより良いintへの変換を制御することができますので、intのために、私はInt32.TryParse()を使用しますので、私はConvert.ToString()を使用します。 。

UPDATE:成績は "" である場合に

C#で任意のNULL可能なタイプがnullになります。そのためにはint?を使用できます。しかし、グレードが "3ds"のようなものなら、動的アプローチを使用する必要があります。

+0

正しいタイプに変換する方法よりもどうすればいいですか? try-catchを実行時変換例外またはそれ以上のエレガントな方法でキャッチしますか?ありがとう! –

+0

申し訳ありませんが、誤って回答を編集しましたが、無視してください。 –

+0

@LifuHuang正しいタイプは何ですか? – kat1330

1

私はむしろ、オブジェクトではなく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; 
} 

私は、これはこれらの事のための「ベストプラクティス」で見つけるだろう。

+0

質問にマッチするには 'int? 'を使用するべきだと思います。 –

+0

@ CyprienAutexier –

+0

なぜ私は彼のユースケースから理解しているものから除外できるようにしたいのですか?あなたのDTOとコンバータ ""は0とみなされます。 –

関連する問題