JSON转换异常——SyntaxError: Unexpected token n in JSON at position 1 如何处理

如题,JSON字符串转换JSON格式报错:

这个问题,一般在JSON字符串转换JSON对象的时候才会出现的,下面就详细介绍下。

为什么会出现这个问题?

对于JSON来说,主要由两种格式,一种是对象,另一种是数组,如下:

//JSON 对象
var jsonObj={ "name":"json", "alexa":10000, "site":null }

//JSON 数组
var jsonArr=[ "Google", "Runoob", "Taobao" ]
//亦或者
var jsonArr=[
   {
     "name":"json",
     "alexa":10000, 
    "site":null 
  },{ 
    "name":"json", 
    "alexa":10000, 
    "site":null
  } 
]

这么看,跟 javascript的对象和数组并没有什么区别。但是有一点需要注意的是,JSON中对象的key值是必须要有引号的(js对象的key是不需要引号的,虽然也能兼容带引号的写法)。

那么,再来看下JSON.parse的用法:

JSON.parse(text[, reviver])

其中:

  • text:必需, 一个有效的 JSON 字符串
  • reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

如上,JSON.parse()函数接收的是有效的JSON字符串,如这样:

//正确用法示例
var jsonStr = '{"name":"jsonStr", "type":"str"}'
var jsonObj = JSON.parse(jsonStr)
//输出 { "name":"runoob", "alexa":10000, "site":"www.runoob.com" }

那么,普通js对象格式的字符串呢?

//正确用法示例
var objStr = '{name:"objStr", type":str"}'
var jsonObj = JSON.parse(objStr)
//SyntaxError: Unexpected token n in JSON at position 1

如上,由于JSON.parse()接收了无效的JSON字符串,导致报错。

那么如何解决这个问题呢?

JSON通常被用来与服务器端交换数据,接收服务器数据时一般是字符串,由前端将JSON数据线转换为JSON数据。

如果后端返回的字符串数据中是无效的JSON字符串(key无引号),那么就无法使用JSON.parse()来进行数据转换了。

对于非有效JSON字符串,可以使用JS的eval()函数进行转换:

var str = '{name:"小明",age:18}';
var json = eval("("+str+")")

除了字符串格式,还有些后端开发会直接返回xml格式数据给到前端,也可能会出现这个问题。如果是这样也只有使用eval()函数了。

当然,这是在明确数据源的情况下使用eval(),eval也并不是能那么随意的使用的。eval也存在一个安全问题,就是它可以执行传给它的任何字符串,所以永远不要传入字符串或者来历不明、不受信任源的参数,以免造成不可预知的后果。

对eval感兴趣的可以详细研究了解下。

 

posted on 2020-10-29 15:28  逍遥云天  阅读(13778)  评论(1编辑  收藏  举报

导航