zoukankan      html  css  js  c++  java
  • 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感兴趣的可以详细研究了解下。

  • 相关阅读:
    从零开始设计一套指令集及其虚拟机
    一种高效整数开平方算法:逐比特确认法
    C 可变参数函数的本质
    C 基础数据类型 性能测试
    用C在GBA上写光线追踪(0)配置开发编译环境
    用C#写小工具:将圆柱面贴图映射到半球贴图
    Linux 硬盘UUID相同处理方法
    ELK6.x_Kafka 安装配置文档
    Nagios4.x安装配置总结
    Cacti-0.8.8b详细安装及配置步骤
  • 原文地址:https://www.cnblogs.com/xyyt/p/13896988.html
Copyright © 2011-2022 走看看