2016-04-15 15 views
3

Ich habe mit dem Projekt gearbeitet, wo ich externe RESTful Service aufrufen muss, um einige Daten zu bekommen.Deserialize JSON String zu C# -Objekt mit newtonsoft

Das Problem, das ich hier gegenüberstelle, ist, die Antwort, die ich vom Service bekomme, ist auf unterschiedlichem Szenario unterschiedlich. Beispielsweise.

auf einem Szenario, ich bin unten Antwort bekommen

{ 
    "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", 
    } 

} 

Im anderen Szenario im unten Antwort bekommen

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

} 

Das Problem hier ist, ich habe unten Modell, und i‘ m deserialisieren es durch newtonsoft deseralization.

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; } 
} 

Für die erste Antwort wird es desrialize. Aber für die zweite Antwort wird die Antwort nicht deserialisiert, da die Antwort [] für Customer und ApplicationAddrees Objekt enthält. Beim Deserialisieren wird es als Array behandelt, aber eigentlich nicht.

Hinweis: Unter Code verwende ich für Deserializing. Antwort Antwort = JsonConvert.DeserializeObject (Ergebnis);

Gibt es irgendeine Konfiguration, die wir vor der Serialisierung durchführen können? Unterstützt newtonsoft diese Funktion?

Danke.

+0

Können Sie bitte Ihre Deserialisierung Anruf teilen? –

+0

Verwenden Sie für die verschiedenen Szenarien unterschiedliche Klassen, um zu deserialisieren. Das erste Beispiel verwendet die Klasse, die Sie haben, die zweite verwendet eine Klasse mit den Listeneigenschaften , List . Sie können eine Basisklasse für die gemeinsamen Eigenschaften verwenden. Ist es ein einzelner Endpunkt, den Sie für die verschiedenen Szenarien aufrufen? –

+0

@TimBourguignon, ich habe die Frage mit Deserialisierungscode aktualisiert. – PaRsH

Antwort

0

Sie können nicht anweisen deserialize zu handhaben „[]“ als etwas anderes als es ein Array darstellt (sind Sie sicher, dass Sie nie Kunden und Adressen in diesem Arrays bekommen ??)

So konnte man deserialize to an anonymous type und dann ordnen Sie es Ihrer Struktur zu.

+0

Ja, das bin ich mir sicher , wir werden nicht Kunde als Arrary bekommen.Es wird immer ein einzelnes Objekt sein. – PaRsH

+0

Ok, also würde ich anonym diesen Fall behandeln – tede24

1

Wenn Sie sicher sind, dass es in diesen Eigenschaften keine Arrays sein, als Sie JsonConverter wie folgt aus betrachten können:

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(); 
    } 
} 

Und dann zusätzliche attribure zu Ihrem Modell setzen:

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

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

Und wenn in Ihrer JSON-Zeichenfolge für diese Eigenschaften wird es ein Array [] sein, werden Sie es einfach mit null Objekt deserialisieren.

0

Dies ist nur eine Vermutung, aber können Sie überprüfen, ob das funktioniert:

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; } 
    } 
}