2016-10-31 8 views
0

文字列プロパティの空のオブジェクト "{}"に応答する外部サービスを消費します。例外を避けるためにいくつかの属性を使用できますか?空のオブジェクト "{}"で文字列プロパティを逆シリアル化する

void should_deserialize() 
{ 
    var json = "{ \"p1\": {} }"; 
    var res = JsonConvert.DeserializeObject<T1>(json); 
} 

class T1 
{ 
    public string P1 { get; set; } 
} 
+2

列が実際にあるかどうそれはで応答しませんか? –

+0

@ LasseV.Karlsenこれは適切なものです:{"p1": "正しい文字列"}しかし、他の時:{"p1":{}} – fravelgue

+3

私は間違いなくそのAPIのメーカーに不平を言うでしょう。将来的にそのようなAPIを作成しないようにする以外の理由や目標はありません。 '{}'はオブジェクトであり、空の文字列ではなく、同じプロパティを持つ異なる型のものは良い考えではありません。 –

答えて

6

あなたはこの問題を回避するために隠されたバッキングフィールドを使用することができます。

class T1 
{ 
    [JsonProperty("p1")] 
    private object _p1; 

    [JsonIgnore] 
    public string P1 
    { 
     get { return _p1 as string; } 
     set { _p1 = value; } 
    } 
} 

var json = "{ \"p1\": {} }"; 
// res.P1 is null 
var res = JsonConvert.DeserializeObject<T1>(json); 

var json2 = "{ \"p1\": \"hello\" }"; 
// res2.P1 is "hello" 
var res2 = JsonConvert.DeserializeObject<T1>(json2); 
+1

私はこれを編集したので私の答えを削除しました。 – Geek

関連する問題