Laden...

JSON: Objekt in Klasse "casten"

Erstellt von pollito vor einem Jahr Letzter Beitrag vor einem Jahr 602 Views
pollito Themenstarter:in
314 Beiträge seit 2010
vor einem Jahr
JSON: Objekt in Klasse "casten"

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:

  1. Frage:

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?

  1. Frage

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é

4.931 Beiträge seit 2008
vor einem Jahr

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(...)

pollito Themenstarter:in
314 Beiträge seit 2010
vor einem Jahr

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é

C
55 Beiträge seit 2020
vor einem Jahr

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

pollito Themenstarter:in
314 Beiträge seit 2010
vor einem Jahr

Natürlich nicht. Das sind von der PayPal-Sandbox zur Verfügung gestellten Daten

René