Laden...

Wie bekomme ich bei JSON Deserialisierung die "[" und "]" Klammern weg?

Erstellt von micha0827 vor 6 Jahren Letzter Beitrag vor 6 Jahren 8.769 Views
M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren
Wie bekomme ich bei JSON Deserialisierung die "[" und "]" Klammern weg?

Guten Tag,

leider habe ich ein Problem mit der Deserialisierung mit Newtonsoft JSON. Wenn ich meinen JSON String (kommt vom Fremdanbieter) bekomme ich als Inhalt der Variable

[ "Außenspiegel & Zubehör" ]

Wie bekomme ich die eckigen Klammern und die Anführungszeichen weg ? Ich möchte das ungern mit Replace machen.

Danke
Michael

D
985 Beiträge seit 2014
vor 6 Jahren

Use the NewtonSoft force, Luke:


var myStrings = JsonConvert.DeserializeObject<List<string>>( jsonString );

😉

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

dann liegt der Fehler in der Deserialisierung ? Mein Aufruf sieht so aus:

var results = JsonConvert.DeserializeObject<dynamic>(abfrageergebnis);

Michael

16.828 Beiträge seit 2008
vor 6 Jahren

Wieso versuchst Du etwas in dynamic zu deserialisieren? 🤔[ "Außenspiegel & Zubehör" ] ist kein gültiges Json-Element.
Eckige Klammern initiieren ein Array. Der Inhalt der eckigen Klammern repäsentiert aber kein Array.

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

wenn ich es nicht dynamisch mache muss ich eine Klasse definieren ? Ich habe das Beispiel mir aus der Doku rausgesucht uind bis jetzt funktionierte es bei anderen Programmen. Wenn ich die Variante von Sir Rufo verwende bekomme ich einen Fehler:

Newtonsoft.Json.JsonSerializationException: "Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[System.String]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

Michael

D
985 Beiträge seit 2014
vor 6 Jahren

[ "Außenspiegel & Zubehör" ] ist kein gültiges Json-Element.

Computer sagt "Nein." => JSON Validator

16.828 Beiträge seit 2008
vor 6 Jahren

.. was dann ein string[] darstellt.

D
985 Beiträge seit 2014
vor 6 Jahren

Wie schön ein kleiner Test doch sein kann


using System;
using System.Collections.Generic;
using Newtonsoft.Json;
					
public class Program
{
	public static void Main()
	{
		var jsonString = "[ \"Außenspiegel & Zubehör\" ]";
		var myStrings = JsonConvert.DeserializeObject<List<string>>(jsonString);
		
		foreach	( var item in myStrings )
		{
			Console.WriteLine(item);
		}
	}
}

Proove yourself => .net fiddle

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

das ist nicht der ganze JSON String, der ist riesig. Ich hatte nur einen Textteil gepostet weil die Texte Probleme machen.


{"findItemsByKeywordsResponse":[{"ack":["Success"],"version":["1.13.0"],"timestamp":["2017-05-19T08:27:08.635Z"],"searchResult":[{"@count":"1","item":[{"itemId":["371114085062"],"title":["AUßENSPIEGEL SPIEGEL RECHTS ELEKTR GRUNDIERT PEUGEOT 206 SCHRÄGHECK+SW BJ 98-"],"globalId":["EBAY-DE"],"subtitle":["### KONVEX \/\/  BEHEIZBAR \/\/ MIT TEMPERATURSENSOR ###"],"primaryCategory":[{"categoryId":["36682"],"categoryName":["Außenspiegel & Zubehör"]}],"secondaryCategory":[{"categoryId":["14769"],"categoryName":["Sonstige"]}],"galleryURL":["http:\/\/thumbs3.ebaystatic.com\/m\/monzB_3J51IV8D_QDlWP25w\/140.jpg"],"viewItemURL":["http:\/\/www.ebay.de\/itm\/AUsENSPIEGEL-SPIEGEL-RECHTS-ELEKTR-GRUNDIERT-PEUGEOT-206-SCHRAGHECK-SW-BJ-98-\/371114085062"],"paymentMethod":["CIPInCheckoutEnabled","CashOnPickup","PayPal","COD","PaymentSeeDescription","MoneyXferAccepted"],"autoPay":["false"],"postalCode":["92690"],"location":["Glashütte,Deutschland"],"country":["DE"],"shippingInfo":[{"shippingServiceCost":[{"@currencyId":"EUR","__value__":"0.0"}],"shippingType":["Free"],"shipToLocations":["Europe"]}],"sellingStatus":[{"currentPrice":[{"@currencyId":"EUR","__value__":"23.19"}],"convertedCurrentPrice":[{"@currencyId":"EUR","__value__":"23.19"}],"sellingState":["Active"],"timeLeft":["P28DT19H58M33S"]}],"listingInfo":[{"bestOfferEnabled":["false"],"buyItNowAvailable":["false"],"startTime":["2014-08-02T04:25:41.000Z"],"endTime":["2017-06-17T04:25:41.000Z"],"listingType":["FixedPrice"],"gift":["false"]}],"compatibility":["Peugeot"],"condition":[{"conditionId":["1000"],"conditionDisplayName":["Neu"]}],"isMultiVariationListing":["false"],"topRatedListing":["true"],"eBayPlusEnabled":["true"]}]}],"paginationOutput":[{"pageNumber":["1"],"entriesPerPage":["1"],"totalPages":["47187"],"totalEntries":["47187"]}],"itemSearchURL":["http:\/\/www.ebay.de\/sch\/i.html?_nkw=Au%C3%9Fenspiegel+Peugeot&_ddo=1&_ipg=1&_pgn=1"]}]}

Michael

D
985 Beiträge seit 2014
vor 6 Jahren

Du bist aber in einem Programmierer-Forum und nicht in einem Hellseher-Forum.

Wenn du nur einen kleinen Teil anfragst bekommst du auch nur eine Teil-Antwort.

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

ja, das tut mir auch sehr leid.

Michael

D
985 Beiträge seit 2014
vor 6 Jahren

Dann schau dir mal Json als Klassen einfügen an.

Ein wenig Handarbeit ist aber noch notwendig, wenn ich mir den Json-String so ansehe.

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

ja, ich kenne das Tool, geht auch für XML, wenn man es aber machen muss ist es einfacher es manuell zu machen als es nachzuarbeiten. Meine Meinung.

Michael

D
985 Beiträge seit 2014
vor 6 Jahren

Na dann mach es doch (egal wie, automatisch oder manuell) und nimm einfach kein dynamic sondern deserialisiere in diesen konkreten Typ.

16.828 Beiträge seit 2008
vor 6 Jahren

Wie schön ein kleiner Test doch sein kann

Ist mir bewusst, dass es als Teil eines Json ein String Array ist. 😭
Aber es stellt weiterhin kein Json Dokument dar, weil dieses eben mit {} beginnt.

D
985 Beiträge seit 2014
vor 6 Jahren

Meines Wissens fängt ein Json Object mit { an und ein Json Array mit [.
Ein Json Dokument enthält entweder ein Json Object oder ein Json Array.

So steht es auch bei json.org

JSON is built on two structures:
A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.

An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

also wäre jetzt der richtige Weg eine Klasse zu definieren und dann in die Klasse zu deserialisieren ? Dann gibt es ja auch wieder den Weg das als XML zu machen (der Anbieter bietet beide Varianten an). Ohne jetzt eine Grundsatzdiskussion anzufangen, findet Ihr JSON oder XML besser ? Spontan fällt mir da die geringere Datenmenge bei JSON ein.

Michael

D
985 Beiträge seit 2014
vor 6 Jahren

Ja, ich würde das immer mit strong types machen.

Ob JSON oder XML ist Geschmackssache. Das Prinzip mit den strong types bleibt. Persönlich bevorzuge ich JSON (sorry XML) wenn ich die Wahl habe.

Der Anwendung ist/sollte es egal sein auf welchem Wege die Informationen den Weg rein und wieder hinaus finden, solange es passiert.

3.003 Beiträge seit 2006
vor 6 Jahren

also wäre jetzt der richtige Weg eine Klasse zu definieren und dann in die Klasse zu deserialisieren ? Dann gibt es ja auch wieder den Weg das als XML zu machen (der Anbieter bietet beide Varianten an). Ohne jetzt eine Grundsatzdiskussion anzufangen, findet Ihr JSON oder XML besser ? Spontan fällt mir da die geringere Datenmenge bei JSON ein.

Wenn du eine Klasse hast, in die du deserialierst, ist dir im besten Fall egal, woraus du es deserialisierst (ob json oder xml). Die Jungs, die dir deine Daten hier liefern, bieten ja auch beides an, und ich möchte doch sehr bezweifeln, dass sie das xml/json von Hand zusammenbauen 😉. Diese beiden Formate stehen nicht in Konkurrenz, sie ergänzen einander. Genausogut könntest du fragen, ob man einen Kreuzschlitz- oder einen Schlitzschraubenzieher besser findet.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
985 Beiträge seit 2014
vor 6 Jahren

Meine Regeln besagen pro Api-Typ und Übertragungs-Format eine eigene Klasse, die auch nur zum De-/Serialisieren verwendet werden. Diese werden dann auf die intern verwendeten Typen gemappt.

Oft muss man mit Attributen noch etwas Feinjustage betreiben (z.B. bei solchen Eigenschaftsnamen wie @code) und dann sieht man vor lauter Xml-, Json-, ... Serialisierungs-Attributen die eigentliche Klasse nicht mehr (wenn man eine Klasse für alle Formate definiert).

Da ich mich aber für ein Format entscheide habe ich auch keine doppelt zu pflegenden Klassen im Api-Client.

3.003 Beiträge seit 2006
vor 6 Jahren

Oft muss man mit Attributen noch etwas Feinjustage betreiben (z.B. bei solchen Eigenschaftsnamen wie @code) und dann sieht man vor lauter Xml-, Json-, ... Serialisierungs-Attributen die eigentliche Klasse nicht mehr (wenn man eine Klasse für alle Formate definiert).

...oder man hat Eigenschaften, die sich gar nicht mit (Standard-)Attributen abbilden lassen (Namespace-Versionierung zB, man stelle sich für 10 verschiedene Versionen eines XML-Schemas vor, dass man jedesmal dasselbe Objekt wieder neu anlegen muss...gruselig). Der Punkt ist: es gibt Serialisierungs- und Deserialisierungsframeworks, und die können das vollständiger und vermutlich auch noch schneller, als wenn man das Problem von Hand löst. @TE: Daher, wie gesagt, arbeite mit fertigen Klassen.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

Vielen Dank, das hat super geklappt, auch mit dem automatischen erstellen der Klasse. Da musste ich nur 2 Anpassungen für den Datentyp vornehmen.

Michael