2014-11-16 79 views
3

當調用findItemsAdvancedRESPONSE-DATA-FORMAT=XML,與預期一致的結果,例如:爲什麼findItemsAdvanced(eBay尋找API)JSON結果元素所有數組?

<findItemsAdvancedResponse xmlns="http://www.ebay.com/marketplace/search/v1/services"> 
    <ack>Success</ack> 
    <version>1.13.0</version> 
    <timestamp>2014-11-16T20:59:57.588Z</timestamp> 
    <searchResult count="0"/> 
    <paginationOutput> 
    <pageNumber>0</pageNumber> 
    <entriesPerPage>100</entriesPerPage> 
    <totalPages>0</totalPages> 
    <totalEntries>0</totalEntries> 
    </paginationOutput> 
    <itemSearchURL>http://www.ebay.co.uk/sch/i.html?_nkw=mytest1</itemSearchURL> 
</findItemsAdvancedResponse> 

但調用與RESPONSE-DATA-FORMAT=JSON一樣,各個元素都被包裹在[]

{"findItemsAdvancedResponse":[ 
    {"ack":["Success"], 
    "version":["1.13.0"], 
    "timestamp":["2014-11-16T20:58:14.639Z"], 
    "searchResult":[ 
    {"@count":"0"}], 
    "paginationOutput":[ 
    {"pageNumber":["0"], 
     "entriesPerPage":["100"], 
     "totalPages":["0"], 
     "totalEntries":["0"]}], 
    "itemSearchURL":["http:\/\/www.ebay.co.uk\/sch\/i.html?&_nkw=mytest1"] 
    }] 
} 

這似乎使它使用Javascript提取結果的痛苦例如:

response.findItemsAdvancedResponse[0].paginationOutput[0].pageNumber[0] 

我在這裏錯過了什麼或做錯了什麼? (如果不會考慮請求XML中的結果並使用XML => JSON轉換工具...)

回答

2

似乎沒有其他人被這種困擾?

我正在使用AngularJS,我希望將Ebay API作爲後端。我必須編寫一個$resource interceptor來摺疊所有隻有1個子元素的數組,以刪除多餘的[]括號。

通用攔截器可以優雅地解決這個但是我認爲這是一個錯誤。

我問的問題在這裏Ebay的開發形式:https://forums.developer.ebay.com/questions/16385/why-does-search-return-json-items-as-array.html#answer-16386

我已經引用在易趣論壇這個頁面 - 希望幫助別人。

編輯:

...和完整性,here is the code I used。這可能不太好,但它對我有用。 YMMV

var resp = {"findItemsAdvancedResponse":[ 
    {"ack":["Success"], 
    "version":["1.13.0"], 
    "timestamp":["2014-11-16T20:58:14.639Z"], 
    "searchResult":[ 
    {"@count":"0"}], 
    "paginationOutput":[ 
     {"pageNumber":["0"], 
     "entriesPerPage":["100"], 
     "totalPages":["0"], 
     "totalEntries":["0"]}], 
    "itemSearchURL":["http:\/\/www.ebay.co.uk\/sch\/i.html?&_nkw=mytest1"] 
    }] 
}; 

var flatten = function(obj) { 
    var ret = {}; 

    if(String === obj.constructor || Number === obj.constructor) { 
    return obj; 
    } 

    for(var prop in obj) { 
    if(!obj.hasOwnProperty(prop)) continue; 

    if(String === obj[prop].constructor || Number === obj[prop].constructor) { 
     ret[prop] = obj[prop]; 
     continue; 
    } 

    if(Object.prototype.toString.call(obj[prop]) === '[object Array]') { 
     if(obj[prop].length==0) 
     ret[prop] = null; 
     if(obj[prop].length==1 && "0" in obj[prop]) { 
     ret[prop] = flatten(obj[prop][0]); 
     } else { 
     ret[prop] = flatten(obj[prop]); 
     } 
     continue; // skip below: all arrays are Objects...! 
    } 

    if(Object === obj[prop].constructor) { 
     ret[prop] = flatten(obj[prop]); 
     continue; 
    } 

    } 
    return ret; 
}; 

console.log(resp); 
resp = flatten(resp); 
console.log(resp); 
console.log(resp.findItemsAdvancedResponse.ack); 
-4

這是JSON。你期望JSON看起來像什麼? :-)

{"findItemsAdvancedResponse":[ 
    {"ack":["Success"], 
    "version":["1.13.0"], 
    "timestamp":["2014-11-16T20:58:14.639Z"], 
    "searchResult":[ 
    {"@count":"0"}], 
    "paginationOutput":[ 
    {"pageNumber":["0"], 
     "entriesPerPage":["100"], 
     "totalPages":["0"], 
     "totalEntries":["0"]}], 
    "itemSearchURL":["http:\/\/www.ebay.co.uk\/sch\/i.html?&_nkw=mytest1"] 
    }] 
} 

嘗試去http://jsonviewer.stack.hu/和粘貼JSON字符串「文本」 -section和點擊的JSON數據的可視化表示「瀏覽器」選項卡。

您可能要訪問的JSON(JavaScript對象符號),維基百科的文章: http://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example

+2

JSON中的方括號表示數組,但大多數元素不是數組(如XML所示)。我預計JSON沒有方括號。 –

+0

陣列與否不會改變響應以JSON形式提供的事實,因爲您要求使用eBay API。擁有「[]」(數組)意味着「一個或多個元素」。在XML中,沒有「一個或多個元素」的指示,因爲所有的XML節點都是數組,因爲它們可以有子節點。然而,我會同意你的看法,eBay的JSON響應中的一些數組不應該是數組 - 「你定義了多少次每頁條目數?答案:1」,除非當然不同類型的頁面可以每頁有不同數量的條目,但這是另一個設計問題。 – LiveLongAndProsper

+1

是的,同意它是有效的JSON,但這並不正確。以前的API(「購物API」)FindItemsAdvanced調用沒有以這種奇怪的方式返回結果。將採取轉換XML到JSON描述[這裏](http://stackoverflow.com/questions/8830599/php-convert-xml-to-json#19391553) - 這給出了我想要他們沒有爲每個元素添加[0]。 –

1

這與DerekC's解析函數非常相似,速度更快。它適合於簡單地找到具有Array.isArray()的數組和長度爲1的數組,其值不是對象。沒有花哨,超級乾淨,超級快。

該函數被稱爲ebayFormat,恰好在DerekC所使用的相同響應對象下方。

var resp = {"findItemsAdvancedResponse":[ 
    {"ack":["Success"], 
    "version":["1.13.0"], 
    "timestamp":["2014-11-16T20:58:14.639Z"], 
    "searchResult":[ 
    {"@count":"0"}], 
    "paginationOutput":[ 
     {"pageNumber":["0"], 
     "entriesPerPage":["100"], 
     "totalPages":["0"], 
     "totalEntries":["0"]}], 
    "itemSearchURL":["http:\/\/www.ebay.co.uk\/sch\/i.html?&_nkw=mytest1"] 
    }] 
}; 

    function ebayFormat(item) { 
    if (typeof item === 'object') { 
     if (Array.isArray(item) && item.length === 1 && typeof item[0] !== 'object') item = item[0]; 
     else { 
     var keys = Object.keys(item), 
      i = 0, 
      len = keys.length; 
     for (; i < len; i++) { 
      if (typeof item[keys[i]] === 'object') item[keys[i]] = ebayFormat(item[keys[i]]); 
     } 
     } 
    } 
    return item; 
    } 

console.log(resp); 
resp = ebayFormat(resp); 
console.log(resp); 
console.log(resp.findItemsAdvancedResponse.ack); 
相關問題