处理 json 数据时出错:无法读取数据,因为它的格式不正确

Posted

技术标签:

【中文标题】处理 json 数据时出错:无法读取数据,因为它的格式不正确【英文标题】:error processing json data: The data couldn’t be read because it isn’t in the correct format 【发布时间】:2017-05-13 17:52:37 【问题描述】:

这个错误一直烦人一上午,我正在尝试检索格式为:

song = 
'artist':'Tom Waits',
'song':'New Coat Of Paint',
'lyrics':'Let\'s put a new coat of paint on this lonesome old town\nSet \'em up, we\'ll be knockin\' em [...]',
'url':'http://lyrics.wikia.com/Tom_Waits:New_Coat_Of_Paint'

来自这个网址:JSON URL

这是我用来解析数据的函数:

  func parseJSONFromData(_ jsonData: Data?) -> [String : AnyObject]?
  
    if let data = jsonData 
      do 
        let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String : AnyObject]//Parses data into a dictionary

        return jsonDictionary

       catch let error as NSError 
        print("error processing json data: \(error.localizedDescription)")
      
    

    return nil
  

【问题讨论】:

这是无效的 JSON:字符串必须用双引号括起来,不能用等号。 那么我该如何检索这些数据呢? 我猜还有其他网站提供有效数据。 快速搜索lyrics.wikia.com json 发现了这个问题***.com/q/41183709/1187415,它使用“fmt=realjson” @MartinR 谢谢!,做到了 【参考方案1】:

如果您访问网站http://json.parser.online.fr,它会让您粘贴数据并检查它是否是有效的 JSON。你的不是。

正如其他人所说,字符串需要用双引号括起来,而不是单引号,并且“=”无效。

编写将所有出现的' 替换为" 的代码非常容易。 song = 位不太清楚。 JSON 的正确格式是:


  "song": 
    "artist":"Tom Waits",
    "song":"New Coat Of Paint",
    "lyrics":"Let\"s put a new coat of paint on this lonesome old town\nSet \"em up, we\"ll be knockin\" em [...]",
    "url":"http://lyrics.wikia.com/Tom_Waits:New_Coat_Of_Paint"
  

或者你可以完全摆脱外部字典:

  
    "artist":"Tom Waits",
    "song":"New Coat Of Paint",
    "lyrics":"Let\"s put a new coat of paint on this lonesome old town\nSet \"em up, we\"ll be knockin\" em [...]",
    "url":"http://lyrics.wikia.com/Tom_Waits:New_Coat_Of_Paint"
  

您需要查看您的数据并找出在一般情况下它有什么问题,导致 JSON 不合法。

编辑:

进一步挖掘后,您使用的 URL 似乎返回的是 javascript,而不是 JSON。试试这样的 URL:

http://lyrics.wikia.com/wikia.php?controller=LyricsApi&method=getSong&artist=Tom%20Waits&song=new%20coat%20of%20paint

这应该会以格式良好的 JSON 为您提供 Tom Waits 歌曲 New Coat of Paint 的歌词。

此 Github 页面提供有关搜索参数的信息,您可以使用它来查询该站点并获取歌词:

https://github.com/Wikia/app/blob/dev/extensions/wikia/LyricsApi/LyricsApiController.class.php#L10-L15

【讨论】:

您可能不想将字符串中的\' 替换为\" 是的。如果字符串包含单引号,它会变得更加复杂。请参阅我的答案的编辑。我提供了一个返回格式正确的 JSON 的 URL。

以上是关于处理 json 数据时出错:无法读取数据,因为它的格式不正确的主要内容,如果未能解决你的问题,请参考以下文章

错误是无法读取数据,因为它的格式不正确

解析 JSON 数据时出错(Swift 4 Playground)

Python 自带Json处理日期格式出错

无法读取数据,因为它的格式不正确(swift)

无法读取数据,因为它的格式不正确 Xcode 11

Swift 无法读取数据,因为它的格式不正确