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
Use the NewtonSoft force, Luke:
var myStrings = JsonConvert.DeserializeObject<List<string>>( jsonString );
😉
dann liegt der Fehler in der Deserialisierung ? Mein Aufruf sieht so aus:
var results = JsonConvert.DeserializeObject<dynamic>(abfrageergebnis);
Michael
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
[ "Außenspiegel & Zubehör" ]
ist kein gültiges Json-Element.
Computer sagt "Nein." => JSON Validator
.. was dann ein string[] darstellt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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
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.
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.
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
Na dann mach es doch (egal wie, automatisch oder manuell) und nimm einfach kein dynamic
sondern deserialisiere in diesen konkreten Typ.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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
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.
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)
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.
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)
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