2016-04-15 15 views
3

私はプロジェクトで作業していました。私は外部RESTfulサービスコールを作成してデータを取得する必要があります。newtonsoftを使用してjson文字列をC#オブジェクトに逆シリアル化する

私がここに直面している問題は、私がサービスから得ているレスポンスが、別のシナリオでは違うことです。例えば。 1つのシナリオに

、私は、私は、モデルの下に持っている、と私は」イムは、ここに応答

{ 
    "id":3000057, 
    "posted_date":"2016-04-15T07:16:47+00:00", 
    "current_status":"initialized", 
    "customer":[], 
    "application_address":[] 

} 

下の問題を取得し、応答他のシナリオでは

{ 
    "id":3000056, 
    "posted_date":"2016-04-15T07:16:47+00:00", 
    "current_status":"initialized", 
    "customer":{ 
     "name" : "George", 
     "lastName" : "Mike" 
    }, 
    "application_address":{ 
     "addressLine1" : "Lin1", 
     "addressLine2" : "Lin2", 
    } 

} 

の下に取得していますnewtonsoft deserailizationでそれをデシリアライズします。

public class Response 
    { 

     [JsonProperty("id")] 
     public int Id { get; set; } 

     [JsonProperty("posted_date")] 
     public DateTime PostedDate { get; set; } 

     [JsonProperty("current_status")] 
     public string CurrentStatus { get; set; } 

     [JsonProperty("customer")] 
     public Customer Customer { get; set; } 

     [JsonProperty("application_address")] 
     public ApplicationAddress ApplicationAddress { get; set; } 


    } 


public Class Customer 
{ 

    public string name { get; set; } 
    public string lastName { get; set; } 
} 

public classs ApplicationAddress 
{ 
public string addreesLine1{ get; set; } 
public string addreesLine1{ get; set; } 
} 

最初の応答については、それは脱感作する。しかし、2番目の応答の場合、応答にはCustomerApplicationAddreesオブジェクトの場合、[]が含まれているため、応答は逆シリアル化されません。デシリアライズ中は配列として扱いますが、実際は配列ではありません。

注:以下のコードはデシリアライズに使用しています。 応答レスポンス= JsonConvert.DeserializeObject(result);

シリアル化する前に設定できることはありますか? newtonsoftはその機能を促進していますか?

ありがとうございました。あなたは「[]」それは配列を表して異なるものとして扱うためのデシリアライズを指示することはできません

+0

をあなたのデシリアライズコールを共有していただけますか? –

+0

異なるシナリオでは、異なるクラスを使用して逆シリアル化します。最初の例はあなたが持っているクラスを使用し、2番目のクラスはList 、List のプロパティを持つクラスを使用します。共有プロパティには基本クラスを使用できます。異なるシナリオを呼び出す単一のエンドポイントですか? –

+0

@TimBourguignon、私は非直列化コードで質問を更新しました。 – PaRsH

答えて

0

(あなたは??これらの配列の顧客とアドレスを取得しませんでし確信している)

だからあなたは可能性がありdeserialize to an anonymous typeとそれをあなたの構造にマップします。

+0

はい、確信しています私たちは顧客を無礼なものにしません。常に単一のオブジェクトになります。 – PaRsH

+0

ですから、このケースを処理するには匿名を使用します – tede24

1

あなたはこのようJsonConverterの使用を検討するよりも、このプロパティには配列がないことを確信している場合:

public class FakeArrayToNullConverter<T> : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return false; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JToken token = JToken.Load(reader); 
     if (token.Type == JTokenType.Array) 
     { 
      return null; 
     } 
     return token.ToObject<T>(); 

    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

そしてモデルに追加attribureを置く:

[JsonProperty("customer")] 
    [JsonConverter(typeof(FakeArrayToNullConverter<Customer>))] 
    public Customer Customers { get; set; } 

    [JsonProperty("application_address")] 
    [JsonConverter(typeof(FakeArrayToNullConverter<ApplicationAddress>))] 
    public ApplicationAddress ApplicationAddressList { get; set; } 

そして、このプロパティのJSON文字列に配列[]がある場合は、nullオブジェクトで単純にデシリアライズします。

0

これは単なる推測ですが、これが動作するかどうかをチェックすることができます:

public class ApplicationAddress 
{ 
    private readonly string[] _array = new string[2]; 
    public string this[int index] 
    { 
     get { return _array[index]; } 
     set { _array[index] = value; } 
    } 
    public string addreesLine1 
    { 
     get { return this[0]; } 
     set { this[0] = value; } 
    } 
    public string addreesLine2 
    { 
     get { return this[1]; } 
     set { this[1] = value; } 
    } 
} 
関連する問題