Hallo,
ich möchte mit .NET 6 aus einem E-Shop die Zahlungsanweisung über dessen RESR-API ermitteln (dafür nutze ich "System.Text.Json" und "System.Text.Json.Serialization)". Es funktioniert auch alles, aber an einer Stelle drehe ich mich im Kreis. Hier ein kleiner Ausschnitt aus den JSON-Daten (E-Shop-Bestellung):
"meta_data": [
{
"id": 31477,
"key": "_shipping_address_type",
"value": ""
},
{
"id": 31479,
"key": "_additional_costs_include_tax",
"value": "yes"
},
{
"id": 31480,
"key": "_shipping_dhl_address_type",
"value": "regular"
},
{
"id": 31481,
"key": "_gzd_version",
"value": "3.9.8"
},
{
"id": 31482,
"key": "_new_order_email_sent",
"value": "true"
},
{
"id": 31484,
"key": "is_vat_exempt",
"value": "no"
},
{
"id": 31487,
"key": "reference_number",
"value": "5GB5061965299422G"
},
{
"id": 31488,
"key": "instruction_type",
"value": "PAY_UPON_INVOICE"
},
{
"id": 31489,
"key": "payment_due_date",
"value": "2022-09-17"
},
{
"id": 31490,
"key": "bank_name",
"value": "Deutsche Bank"
},
{
"id": 31491,
"key": "account_holder_name",
"value": "PayPal Europe"
},
{
"id": 31492,
"key": "international_bank_account_number",
"value": "DE63120700888000584157"
},
{
"id": 31493,
"key": "bank_identifier_code",
"value": "DEUTDEDBPAL"
},
{
"id": 31494,
"key": "_payment_instruction_result",
"value": {
"reference_number": "5GB5061965299422G",
"instruction_type": "PAY_UPON_INVOICE",
"recipient_banking_instruction": {
"bank_name": "Deutsche Bank",
"account_holder_name": "PayPal Europe",
"international_bank_account_number": "DE63120700888000584157",
"bank_identifier_code": "DEUTDEDBPAL"
}
}
},
usw.
In der Klasse "Orders", die die Bestellungen aufnimmt, habe ich unter anderen folgendes:
internal class Orders
{
...
/// <summary>
/// Metadaten wie u. v. a. Zahlungsinformation
/// </summary>
[JsonPropertyName("meta_data")]
public List<MetaData> Metadaten { get; set; } = new();
...
}
Und die Klasse "MetaData":
public class MetaData
{
/// <summary>
/// ID
/// </summary>
[JsonPropertyName("id")]
public int Id { get; set; }
/// <summary>
/// Key
/// </summary>
[JsonPropertyName("key")]
public string Key get; set; } = string.Empty;
/// <summary>
/// Value
/// </summary>
[JsonPropertyName("value")]
public object Value { get; set; }
}
Nun ist es so, dass das Objekt "Value" mal einen String und mal eine weitere JSON-Struktur darstellt. Für den zweiten Fall (siehe nachstehenden code)
{
"id": 31494,
"key": "_payment_instruction_result",
"value": {
"reference_number": "5GB5061965299422G",
"instruction_type": "PAY_UPON_INVOICE",
"recipient_banking_instruction": {
"bank_name": "Deutsche Bank",
"account_holder_name": "PayPal Europe",
"international_bank_account_number": "DE63120700888000584157",
"bank_identifier_code": "DEUTDEDBPAL"
}
}
},
habe ich mir folgendes für "Value" überlegt:
public class Zahlungsanweisung
{
/// <summary>
/// Transaktionsnummer
/// </summary>
[JsonPropertyName("reference_number")]
public string Transaktionsnummer { get; set; } = string.Empty;
/// <summary>
/// Zahlungsart
/// </summary>
[JsonPropertyName("instruction_type")]
public string Zahlungsart { get; set; } = string.Empty;
/// <summary>
/// Zahlungsinformation
/// </summary>
[JsonPropertyName("recipient_banking_instruction")]
public Zahlungsinformation Zahlungsinformation { get; set; } = new();
}
Und für die Zahlungsinformation:
public class Zahlungsinformation
{
[JsonPropertyName("bank_name")]
public string Bank { get; set; } = string.Empty;
[JsonPropertyName("account_holder_name")]
public string Kontoinhaber { get; set; } = string.Empty;
[JsonPropertyName("international_bank_account_number")]
public string IBAN { get; set; } = string.Empty;
[JsonPropertyName("bank_identifier_code")]
public string BIC { get; set; } = string.Empty;
}
Hier habe ich gleich zwei Fragen:
Wenn ich mir im Debugger einen der Metadaten-Elemente anschaue, der einem String entspricht, sieht es so aus:
Id 31479 int
Key "_additional_costs_include_tax" string
Value ValueKind = String : "yes" object {System.Text.Json.JsonElement}
Wie konvertiere ich diesen Wert (hier "yes") in einen gewöhnlichen String?
Im Fall dass es sich nicht um einen String handelt – wie im vorigen Punkt –, bekommen ich die Zahlungsanweisung. Diese sieht im Debugger so aus:
Id 31494 int
Key "_payment_instruction_result" string
Value ValueKind = Object : "{"reference_number":"5GB5061965299422G","instruction_type":"PAY_UPON_INVOICE","recipient_banking_instruction":{"bank_name":"Deutsche Bank","account_holder_name":"PayPal Europe","international_bank_account_number":"DE63120700888000584157","bank_identifier_code":"DEUTDEDBPAL"}}" object {System.Text.Json.JsonElement}
Wie kann ich a) diese Infos in "Zahlungsanweisung" und "Zahlungsinformation" packen und b) wie kann ich das mit "MetaData.Value" verknüpfen?
Irgendwie drehe ich mich im Kreis und habe eine Denkblockade.
Vielen Dank und liebe Grüße
René
René
Da zur Laufzeit beide Value
-Objekte vom Typ JsonElement sind, kannst du darauf casten und z.B. GetString()
oder GetProperty(String)
aufrufen.
Zum Casten in ein komplettes Klassenobjekt mußt du das JsonElement
selber deserialisieren: JsonSerializer.Deserialize(...)
Lieben Dank, das hat mir weitergeholfen.
Im ersten Fall reicht es ein simples ToString() vollkommen aus:
var result = meta.Value.ToString();
Heute ist wahrlich nicht mein Tag.
Im Zweiten Fall ist die Sache auch einfach – aus dem Objekt wird ein JSON-String (meta.Value.ToString()
) gemacht und dieser wird dann mit JsonSerializer.Deserialize<Zahlungsanweisung>(meta.Value.ToString())
in die dafür vorgesehenen Klassen deserialisiert:
Zahlungsanweisung? za = JsonSerializer.Deserialize<Zahlungsanweisung>(meta.Value.ToString());
Dann erhalte ich das gewünschte Ergebnis:
Zahlungsanweisung
Transaktionsnummer "5GB5061965299422G" string
Zahlungsart "PAY_UPON_INVOICE" string
Zahlungsinformation
BIC "DEUTDEDBPAL" string
Bank "Deutsche Bank" string
IBAN "DE63120700888000584157" string
Kontoinhaber "PayPal Europe" string
Danke nochmals und ein schönes Wochenende.
LG
René
René
Hallo,
Das sind jetzt aber keine echten Bankverbindungsdaten von dir oder sonst wem oder?! Das sind sensible Informationen, die man nicht einfach in ein Forum postet vom Datenschutz mal ganz zu schweigen...
Grüße
Natürlich nicht. Das sind von der PayPal-Sandbox zur Verfügung gestellten Daten
René