2017-06-22 5 views
1

Ich versuche, eine Zeichenfolge von JSON-Daten in ein C# -Klasseobjekt zu konvertieren. Allerdings habe ich ein Problem mit einem kleinen Teil des JSON, der von Natur aus dynamisch ist.Json DeserializeObject in Klasse mit dynamischer Eigenschaft

Der Teil des JSON ist unten:

"contact": [{ 
    "comment": null, 
    "type": { 
     "id": "cell", 
     "name": "Example name" 
    }, 
    "preferred": true, 
    "value": { 
     "country": "7", 
     "formatted": "+7 (702) 344-3423-3", 
     "number": "3498908", 
     "city": "702" 
    } 
}, 
{ 
    "type": { 
     "id": "email", 
     "name": "Email example" 
    }, 
    "preferred": false, 
    "value": "[email protected]" 
}] 

C# -Klassen

public class Value 
{ 
    public string country { get; set; } 
    public string formatted { get; set; } 
    public string number { get; set; } 
    public string city { get; set; } 
} 

public class Type 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
} 

public class Contact 
{ 
    public string comment { get; set; } 
    public Type type { get; set; } 
    public bool preferred { get; set; } 
    public string value { get; set; } 
} 

C# -Code

Contact contact = JsonConvert.DeserializeObject<Contact>(result); 

Das Format von "Wert" Änderungen an den Kontaktinformationen abhängig. Ist es möglich, Werte sowohl als String als auch als Klasse Value abzubilden?

Danke für jede Hilfe, die zur Verfügung gestellt werden kann.

+0

mir sieht es aus wie Sie die Klassenstruktur falsch haben. sieht so aus, als ob es eine Basisklasse Value und zwei weitere Klassen AddressValue und EmailValue gibt. –

Antwort

2

können Sie buchstäblich nur verwenden dynamic, dh

public dynamic value { get; set; } 

Wenn es wie ein Objekt aussieht, wird es als JObject materialisiert, das über die API dynamic verwendet werden kann, also funktioniert .value.country, usw. Wenn es wie eine ganze Zahl, bool oder string aussieht: es wird als solches materialisiert . Arrays werden ebenfalls entsprechend gehandhabt. Also: Sie können überprüfen, ob .value is string, etc. Beachten Sie, dass dies nicht Ihre Value Art verwenden wird, und dies ist komplexer, aber: meh; Du bekommst die Daten. Sie können das immer manuell ausschalten.

Es verhält sich auch so, wenn Sie object anstelle von dynamic verwenden, aber dann ist es schwieriger, auf die inneren Eigenschaften zuzugreifen.

+0

Danke Marc, das hat für mich funktioniert. Ich änderte die Eigenschaft zu 'öffentlichen dynamischen Wert {erhalten; einstellen; } ' – user5498736

0

Contact contact = JsonConvert.DeserializeObject<Contact>(result[0]); 

Versuchen Wie Sie im JSON sehen können, ist es

"contact": [ 

ein Array Zeigen, zur Zeit sind Sie nur das gesamte Array vorbei

+0

Ich denke nicht, dass das der Punkt der Frage ist; Ich denke OP sagt "hier ist ein Fragment eines größeren Objekts", in dem es einen 'Kontakt []' oder 'Liste ' namens 'contact' gibt. –

0

Sofern Sie nicht sicher sind, dass der JSON immer mit der gleichen Struktur kommt, verwenden Sie am besten eine dynamic Variable statt deserialize in einer Klasse.

Wenn Sie gerne mit Klassen arbeiten, können Sie Ihre eigenen unter runtime mit reflection bauen. Aber das ist wie tötet eine Fliege mit einer Kanone und Sie werden wahrscheinlich nicht brauchen, also verwenden Sie einfach eine dynamic Variable, es ist das Beste, mit JSON-Strings zu arbeiten.

Verwandte Themen