簡體   English   中英

如果字段返回 TypeError,則忽略 JSON 解析錯誤

[英]Ignore JSON parsing error if a field returns TypeError

這感覺就像一個非常簡單的 try/catch 問題,但作為一個完全的 JavaScript 菜鳥,我顯然錯過了一些東西。

我正在嘗試解析來自克利夫蘭藝術博物館開放收藏 API 的數據。 一切正常,除了一些作品沒有命名所涉及的藝術家。

當元數據中包含藝術家時(例如此處),此代碼段有效地提取了它:

jsonObj['data'][0]['creators'][0]['description']

當元數據中沒有藝術家時(例如這里),我得到一個

類型錯誤:jsonObj.data[0].creators[0] 未定義

錯誤。

互聯網表明這是使用 try/catch 語句的最佳時機:

var data_author = tryCatch(jsonObj['data'][0]['creators'][0]['description'])

var function_image_data = [data_author]

function tryCatch(json_address) {
    try {
         output_json_data = json_address
     }
     catch (e) {
         output_json_data = ''

     }

      return output_json_data
  }

雖然這在有作者條目時有效,但在出現錯誤時似乎沒有影響。 我在這句話中遺漏了什么非常明顯的東西?

謝謝!

編輯:基於 tex 下面的建議,我將嘗試從函數中獲取數據並直接放入代碼中。 我不完全確定它為什么起作用,但它確實避免了在事物到達函數之前被評估的可能性。 搜索作品所有元素的部分現在看起來像:

    var data_tombstone = tryCatch(jsonObj['data'][0]['tombstone'])
    console.log(data_tombstone)
    var data_title = tryCatch(jsonObj['data'][0]['title'])
    try {
         data_author = jsonObj['data'][0]['creators'][0]['description']
     }
     catch (e) {
         data_author = ''

     }
    var data_creation_date = tryCatch(jsonObj['data'][0]['creation_date'])

jsonObj['data'][0]['creators'][0]['description']在您的tryCatch函數被調用之前被評估,這意味着錯誤不會被捕獲。

如果您願意使用庫,我建議您使用Ramda 這是使用 Ramda 的解決方案(不涉及try..catch

 const works = { data: [{ creators: [{ description: 'an author'}] }] } const doesntWork = { data: [{ creators: [] }] } const getAuthor = R.pathOr('', ['data', 0, 'creators', 0, 'description']) const data_author_works = getAuthor(works) const data_author_doesnt_work = getAuthor(doesntWork) console.log('works: ', data_author_works) console.log('doesn\\'t work: ', data_author_doesnt_work)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>

如果您不想使用庫,並且確實想使用try...catch ,則需要執行以下操作,但我不推薦這種方法:

 const works = { data: [{ creators: [{ description: 'an author'}] }] } const doesntWork = { data: [{ creators: [] }] } const getAuthor = jsonData => { try { return jsonData.data[0].creators[0].description } catch (e) { return '' } } const data_author_works = getAuthor(works) const data_author_doesnt_work = getAuthor(doesntWork) console.log('works: ', data_author_works) console.log('doesn\\'t work: ', data_author_doesnt_work)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM