Ebay API JSON Deserialization

04/09/2015 21:08 Ludder231#1
Hi,

ich hab hier mit der Ebay API mal ein paar Produkte gesucht.

PHP Code:
string bla Connection.WebRPost("http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-NAME=FindingService&SERVICE-VERSION=1.0.0&GLOBAL-ID=EBAY-DE&SECURITY-APPNAME=dsadasdasESPONSE-DATA-FORMAT=JSON&REST-PAYLOAD&keywords=kuchenl"); 
Klappt super mit dem JSON return. Leider bekomme ich mit meinem Code keine auswertung vom JSON.

PHP Code:
{"findItemsByKeywordsResponse":[{"ack":["Success"],"version":["1.13.0"],"timestamp":["2015-04-09T19:53:02.465Z"],"searchResult":[{"@count":"100","item":[{"itemId":["231527381785"],"title":["Kuchen und so (PC, 2005, DVD-Box)"],"globalId":["EBAY-DE"],"primaryCategory":[{"categoryId":["139973"],"categoryName":["PC- & Videospiele"]}],"galleryURL":["http:\/\/thumbs2.ebaystatic.com\/m\/mOPBGu-74ZhrsIMiWP9yYcQ\/140.jpg"],"viewItemUR 
Code:


Könnte es an dem "findItemsByKeywordsResponse" liegen, dass ich den noch iwie auswerten muss oder so?
04/09/2015 21:12 tolio#2
das json was du gepostet hast ist ungültig, sieht aus als würde am ende was fehlen
und dann einfach einen der unzähligen json to c# converter nutzen:
[Only registered and activated users can see links. Click Here To Register...]
04/09/2015 21:13 Ludder231#3
Der JSON String den ich gepostet habe ist nur ein Snippet wollte keine 10000 zeilen posten. Danke aber für den Tipp mit dem Converter.
04/09/2015 21:20 tolio#4
dann poste mal den kompletten json string, sonst kann man sich das schlecht anschauen was nicht hinhaut. kannste ja pastebin o.ä. nutzen

ansonsten fehlen da noch die [DataContract] und [DataMember] attribute
04/09/2015 21:29 Ludder231#5
[Only registered and activated users can see links. Click Here To Register...]

Sonst hier mal der JSON String für 1 Item aus der Liste :D

PHP Code:
"ack":["Success"],"version":["1.13.0"],"timestamp":["2015-04-09T20:39:46.878Z"],"searchResult":[{"@count":"1","item":[{"itemId":["231527381785"],"title":["Counter-Strike: Source (PC, 2005, DVD-Box)"],"globalId":["EBAY-DE"],"primaryCategory":[{"categoryId":["139973"],"categoryName":["PC- & Videospiele"]}],"galleryURL":["http:\/\/thumbs2.ebaystatic.com\/m\/mOPBGu-74ZhrsIMiWP9yYcQ\/140.jpg"],"viewItemURL":["http:\/\/www.ebay.de\/itm\/Counter-Strike-Source-PC-2005-DVD-Box-\/231527381785?pt=LH_DefaultDomain_77"],"productId":[{"@type":"ReferenceID","__value__":"66656878"}],"paymentMethod":["PayPal"],"autoPay":["false"],"postalCode":["81243"],"location":["München,Deutschland"],"country":["DE"],"shippingInfo":[{"shippingServiceCost":[{"@currencyId":"EUR","__value__":"1.6"}],"shippingType":["Flat"],"shipToLocations":["DE"]}],"sellingStatus":[{"currentPrice":[{"@currencyId":"EUR","__value__":"1.0"}],"convertedCurrentPrice":[{"@currencyId":"EUR","__value__":"1.0"}],"bidCount":["0"],"sellingState":["Active"],"timeLeft":["P0DT10H10M3S"]}],"listingInfo":[{"bestOfferEnabled":["false"],"buyItNowAvailable":["false"],"startTime":["2015-04-09T06:49:49.000Z"],"endTime":["2015-04-10T06:49:49.000Z"],"listingType":["Auction"],"gift":["false"]}],"condition":[{"conditionId":["6000"],"conditionDisplayName":["Akzeptabel"]}],"isMultiVariationListing":["false"],"topRatedListing":["false"]}]}],"paginationOutput":[{"pageNumber":["1"],"entriesPerPage":["1"],"totalPages":["311"],"totalEntries":["311"]}],"itemSearchURL":["http:\/\/www.ebay.de\/sch\/i.html?_nkw=counterstrike&_ddo=1&_ipg=1&_pgn=1"]}]} 
Wenn nur 1 Item angezeigt wird , ist auch "findItemsByKeywordsResponse" nicht mehr mit drin.
04/10/2015 09:38 Shawak#6
Dein Syntax ist falsch

Code:
class EbayCatalogDeserialization
{
  public findItemsByKeywordsResponse findItemsByKeywordsResponse { get; set; }
}

class findItemsByKeywordsResponse
{
  public string[] ack { get; set; }
  // ..
}
04/10/2015 20:14 Ludder231#7
Quote:
Originally Posted by Shawak View Post
Dein Syntax ist falsch

Code:
class EbayCatalogDeserialization
{
  public findItemsByKeywordsResponse findItemsByKeywordsResponse { get; set; }
}

class findItemsByKeywordsResponse
{
  public string[] ack { get; set; }
  // ..
}
Funktioniert leider nicht. Fehler:
PHP Code:
{"Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'GreenKeys_Ebay_Helper_V2.findItemsByKeywordsResponse' because the type requires a JSON object (e.g. {\"name\":\"value\"}) to deserialize correctly.\r\nTo fix this error either change the JSON to a JSON object (e.g. {\"name\":\"value\"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.\r\nPath 'findItemsByKeywordsResponse', line 1, position 32."
Kann es sein das die JSON Datei bzw. String nicht ganz korrekt aufgebaut ist?
04/10/2015 21:06 tolio#8
das json ist syntaktisch richtig, ich frage mich nur warum das fast alles arrays sind, aber das wird nur ebay selber wissen.
ich schau wenn ich zeit hab noch mal drüber und bis dahin keiner weiter helfen konnte.

Program.cs:
Code:
static void Main(string[] args)
{
    var json = File.ReadAllText("Json.txt");
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));

    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(JsonRoot));
    var r = (JsonRoot)ser.ReadObject(ms);
    //test
    Console.WriteLine(r.FindItemsByKeywordsResponse[0].Ack[0]);
    Console.WriteLine(r.FindItemsByKeywordsResponse[0].SearchResult[0].Count);
    Console.WriteLine(r.FindItemsByKeywordsResponse[0].SearchResult[0].Item.Count);
    Console.WriteLine(r.FindItemsByKeywordsResponse[0].SearchResult[0].Item[0].ItemId[0]);
    Console.WriteLine(r.FindItemsByKeywordsResponse[0].SearchResult[0].Item[0].Title[0]);

    Console.ReadLine();
}
Json.cs:
Code:
[DataContract]
public class Category
{
    [DataMember(Name = "categoryId")]
    public IList<string> CategoryId { get; set; }

    [DataMember(Name = "categoryName")]
    public IList<string> CategoryName { get; set; }
}

[DataContract]
public class PrimaryCategory : Category { }

[DataContract]
public class SecondaryCategory : Category { }

[DataContract]
public class CurrencyInfo
{
    [DataMember(Name = "@currencyId")]
    public string CurrencyId { get; set; }
    [DataMember(Name = "__value__")]
    public string Value { get; set; }
}

[DataContract]
public class ShippingServiceCost : CurrencyInfo { }

[DataContract]
public class CurrentPrice : CurrencyInfo { }

[DataContract]
public class ConvertedCurrentPrice : CurrencyInfo { }

[DataContract]
public class ConvertedBuyItNowPrice : CurrencyInfo { }

[DataContract]
public class BuyItNowPrice : CurrencyInfo { }

[DataContract]
public class SearchResult
{
    [DataMember(Name = "@count")]
    public string Count { get; set; }
    [DataMember(Name = "item")]
    public IList<Item> Item { get; set; }
}

[DataContract]
public class ProductId
{
    [DataMember(Name = "@type")]
    public string @Type { get; set; }
    [DataMember(Name = "__value__")]
    public string Value { get; set; }
}

[DataContract]
public class ShippingInfo
{
    [DataMember(Name = "shippingServiceCost")]
    public IList<ShippingServiceCost> ShippingServiceCost { get; set; }
    [DataMember(Name = "shippingType")]
    public IList<string> ShippingType { get; set; }
    [DataMember(Name = "shipToLocations")]
    public IList<string> ShipToLocations { get; set; }
}
[DataContract(Name = "SellingStatu")]
public class SellingStatus
{
    [DataMember(Name = "currentPrice")]
    public IList<CurrentPrice> CurrentPrice { get; set; }
    [DataMember(Name = "convertedCurrentPrice")]
    public IList<ConvertedCurrentPrice> ConvertedCurrentPrice { get; set; }
    [DataMember(Name = "bidCount")]
    public IList<string> BidCount { get; set; }
    [DataMember(Name = "sellingState")]
    public IList<string> SellingState { get; set; }
    [DataMember(Name = "timeLeft")]
    public IList<string> TimeLeft { get; set; }
}

[DataContract]
public class ListingInfo
{
    [DataMember(Name = "bestOfferEnabled")]
    public IList<string> BestOfferEnabled { get; set; }
    [DataMember(Name = "buyItNowAvailable")]
    public IList<string> BuyItNowAvailable { get; set; }
    [DataMember(Name = "startTime")]
    public IList<string> StartTime { get; set; }
    [DataMember(Name = "endTime")]
    public IList<string> EndTime { get; set; }
    [DataMember(Name = "listingType")]
    public IList<string> ListingType { get; set; }
    [DataMember(Name = "gift")]
    public IList<string> Gift { get; set; }
    [DataMember(Name = "buyItNowPrice")]
    public IList<BuyItNowPrice> BuyItNowPrice { get; set; }
    [DataMember(Name = "convertedBuyItNowPrice")]
    public IList<ConvertedBuyItNowPrice> ConvertedBuyItNowPrice { get; set; }
}

[DataContract]
public class Condition
{
    [DataMember(Name = "conditionId")]
    public IList<string> ConditionId { get; set; }
    [DataMember(Name = "conditionDisplayName")]
    public IList<string> ConditionDisplayName { get; set; }
}

[DataContract]
public class Item
{
    [DataMember(Name = "itemId")]
    public IList<string> ItemId { get; set; }
    [DataMember(Name = "title")]
    public IList<string> Title { get; set; }
    [DataMember(Name = "globalId")]
    public IList<string> GlobalId { get; set; }
    [DataMember(Name = "primaryCategory")]
    public IList<PrimaryCategory> PrimaryCategory { get; set; }
    [DataMember(Name = "galleryURL")]
    public IList<string> GalleryUrl { get; set; }
    [DataMember(Name = "viewItemURL")]
    public IList<string> ViewItemUrl { get; set; }
    [DataMember(Name = "productId")]
    public IList<ProductId> ProductId { get; set; }
    [DataMember(Name = "paymentMethod")]
    public IList<string> PaymentMethod { get; set; }
    [DataMember(Name = "autoPay")]
    public IList<string> AutoPay { get; set; }
    [DataMember(Name = "postalCode")]
    public IList<string> PostalCode { get; set; }
    [DataMember(Name = "location")]
    public IList<string> Location { get; set; }
    [DataMember(Name = "country")]
    public IList<string> Country { get; set; }
    [DataMember(Name = "shippingInfo")]
    public IList<ShippingInfo> ShippingInfo { get; set; }
    [DataMember(Name = "sellingStatus")]
    public IList<SellingStatus> SellingStatus { get; set; }
    [DataMember(Name = "listingInfo")]
    public IList<ListingInfo> ListingInfo { get; set; }
    [DataMember(Name = "condition")]
    public IList<Condition> Condition { get; set; }
    [DataMember(Name = "isMultiVariationListing")]
    public IList<string> IsMultiVariationListing { get; set; }
    [DataMember(Name = "topRatedListing")]
    public IList<string> TopRatedListing { get; set; }
    [DataMember(Name = "subtitle")]
    public IList<string> Subtitle { get; set; }
    [DataMember(Name = "secondaryCategory")]
    public IList<SecondaryCategory> SecondaryCategory { get; set; }
    [DataMember(Name = "galleryPlusPictureURL")]
    public IList<string> GalleryPlusPictureUrl { get; set; }
}

[DataContract]
public class PaginationOutput
{
    [DataMember(Name = "pageNumber")]
    public IList<string> PageNumber { get; set; }
    [DataMember(Name = "entriesPerPage")]
    public IList<string> EntriesPerPage { get; set; }
    [DataMember(Name = "totalPages")]
    public IList<string> TotalPages { get; set; }
    [DataMember(Name = "totalEntries")]
    public IList<string> TotalEntries { get; set; }
}

[DataContract]
public class FindItemsByKeywordsResponse
{
    [DataMember(Name = "ack")]
    public IList<string> Ack { get; set; }
    [DataMember(Name = "version")]
    public IList<string> Version { get; set; }
    [DataMember(Name = "timestamp")]
    public IList<string> Timestamp { get; set; }
    [DataMember(Name = "searchResult")]
    public IList<SearchResult> SearchResult { get; set; }
    [DataMember(Name = "paginationOutput")]
    public IList<PaginationOutput> PaginationOutput { get; set; }
    [DataMember(Name = "itemSearchURL")]
    public IList<string> ItemSearchUrl { get; set; }
}

[DataContract]
public class JsonRoot
{
    [DataMember(Name = "findItemsByKeywordsResponse")]
    public IList<FindItemsByKeywordsResponse> FindItemsByKeywordsResponse { get; set; }
}
mit den daten die auf pastebin waren hauts hin, output:
Code:
Success
100
100
231527381785
Counter-Strike: Source (PC, 2005, DVD-Box)
im zweifel kann man noch in einigen DataMemberAttributen IsRequired setzen um bei ungültigen daten direkt ne Exception zu bekommen, denn mit diesen ganzen arrays da drin hat man eh schon genug spaß mit null/count checks
04/15/2015 17:34 Ludder231#9
Danke denke mal das wird funktionieren. Sorry aber ich glaube mir fehlen paar usings, da ich 115 Errors habe wegen dem "DataContract".
04/15/2015 18:07 tolio#10
ich helfe echt gerne, aber so ein ganz bischen an eigeninitiative ist doch echt nicht zu viel verlangt. manche leute warten wohl lieber bis zu tage auf antworten im forum als wenige sekunden selber zu googlen.
[Only registered and activated users can see links. Click Here To Register...]
04/15/2015 21:03 Shawak#11
Rechtsklick auf DataContract -> Auflösen

gg