微信小程序获取JSON数据时遇到数组,请教如何获取数据?

发布网友 发布时间:2022-04-23 05:40

我来回答

3个回答

懂视网 时间:2022-05-14 22:14

这篇文章主要介绍了关于微信小程序中如何解决wx.request对于JSON 含u2028的处理异常,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

问题描述

最近在小程序的开发过程中,遇到一个神奇的问题。

小程序用于发起网络请求的 API wx.request 默认会对为 JSON 格式的响应体进行解析,返回 JS Object。

wx.request({
 url: 'test.php', //仅为示例,并非真实的接口地址
 data: {
 x: '',
 y: ''
 },
 header: {
 'content-type': 'application/json' // 默认值
 },
 success: function(res) {
 console.log(res.data)
 }
})

其中 res.data 一般会是 Object 类型。

但是,响应体的 JSON 数据包含了 \u2028 的字符,就会解释失败,输出的 res.data 是响应体的字符串类型。

样本

测试样本:{“test”:”这里有一个特殊字符:? "}

测试代码:

wx.request({
 ...
 success: (res) => {
 console.log('APIFactory:run', '调试', { res });
 },
});

结果:

  1. 在 开发者工具 中,能正常解析
    22437377-5b38f4cfa5d88_articlex[1].jpg

  2. 在 真机(iOS 和 Android),都解析失败
    1985084709-5b38f4e1d3fb6_articlex[1].jpg

u2028

该特殊字符就是 u2028,解析为行分隔符。
该字符,在 JSON 字符串中,是被兼容的,是能被 JSON.parse 正常解析的。
但是 JS 代码中有这个字符串,就会导致运行出错。

为什么真机和开发者工具表现不一致

微信小程序运行在三端:iOS、Android 和 用于调试的开发者工具。
三端的JS脚本执行环境是各不相同的:

  • 在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中。

  • 在 Android 上,小程序的 javascript 代码是通过 X5 JSCore来解析。

  • 在 开发工具上, 小程序的 javascript 代码是运行在 nwjs 中。

  • 而小程序的逻辑层和视图层,都是通过「WeixinJsBridge」来调用 Native API 的。

    1051666636-5b38f4f070009_articlex[1].jpg

    所以问题出在,wx.request 对于响应体的数据处理,到底是在 JS Engine 处理的,还是 Native 处理的,在微信不公开小程序源码的情况下,不得而知。

    wx.request 的处理对于我们来说,相当于黑盒,并且对于 res.data 的数据类型可能值是多种的,如果想在业务上提供更好的健壮性,还需要兼容 res.dataObject/String 类型时的判断和容错代码。

    热心网友 时间:2022-05-14 19:22

    1、在MYSQL中新建一个test数据库,在里面新建一张type数据表,下面将从该表获得数据。

    2、新建一个project小程序项目。

    3、在project项目内,新建一个index模块来从数据库获得数据,并将数据输出在index.wxml页面。

    4、在index模块中index.js页面,在onLoad中使用wx.request方法向服务端文件请求数据。url为请求数据的地址;data为传输的参数,这里设置为空;method为传递参数的方式,header用于设置请求的数据类型,success是成功获得数据后的操作。

    5、在index.wxml页面,使用for循环遍历输出index.js传递过来的数据data,通过item将data数据输出在页面。

    6、在服务端新建一个api.php页面来接*小程序的数据请求。

    7、最后编译微信小程序,查看从数据表type获得数据内容,成功从数据库读取数据并输出在页面上。

    热心网友 时间:2022-05-14 20:40

    1.用到的知识点
    <1> wx.request 请求接口资源(微信小程序api中的发起请求部分)
    <2>swiper 实现轮播图的组件
    <3>wx:for 循环语句
    <4>微信小程序的基础知识
    2.实现原理
    首先,先看一下这个请求函数
    var
    wx.request({
    url: '******', //这里填写你的接口路径
    header: { //这里写你借口返回的数据是什么类型,这里就体现了微信小程序的强大,直接给你解析数据,再也不用去寻找各种方法去解析json,xml等数据了
    'Content-Type': 'application/json'
    },
    data: {//这里写你要请求的参数
    x: '' ,
    y: ''
    },

    success: function(res) {
    //这里就是请求成功后,进行一些函数操作
    console.log(res.data)
    }
    })123456710111213141516123456710111213141516

    3.代码
    分解图

    <1>首先上一段知乎接口数据的json格式中的开头
    "date":"20161114",
    "stories":[
    {
    "images":[
    "http://pic2.mg.com/76125c357aa7b0ca6c9cbc41b4a5326d.jpg"
    ],
    "type":0,
    "id":75316,
    "ga_prefix":"111422",
    "title":"小事 · 我和你们一样"
    },
    {
    "images":[
    "http://pic1.mg.com/7c908a5940384123fd88287dbc6a2c98.jpg"
    ],
    "type":0,
    "id":77438,
    "ga_prefix":"111421",
    "title":"成长嘛,谁说就意味着一定要长大了?"
    },1234567101112131415161718192012345671011121314151617181920

    <2>index.js中
    Page({
    data: {
    ration: 2000,
    indicatorDots: true,
    autoplay: true,
    interval: 3000,
    loading: false,
    plain: false
    },
    onLoad: function () {
    var that = this//不要漏了这句,很重要
    wx.request({
    url: 'http://news-at.hu.com/api/4/news/latest',
    headers: {
    'Content-Type': 'application/json'
    },
    success: function (res) {
    //将获取到的json数据,存在名字叫hu的这个数组中
    that.setData({
    hu: res.data.stories,
    //res代表success函数的事件对,data是固定的,stories是是上面json数据中stories

    })
    }
    })

    }
    })1234567101112131415161718192021222324252627282912345671011121314151617181920212223242526272829

    <3> index.wxml中
    <view >
    <swiper indicator-dots="{{indicatorDots}}"
    autoplay="{{autoplay}}" class="banners" interval="{{interval}}" ration="{{ration}}">//这里边的属性不重要,看下边
    <block wx:for="{{hu}}">
    <swiper-item class="banner" >
    <image src="{{item.image}}" data-id="{{item.b}}" bindtap="bindViewTap" class="banner-image" width="100%" height="100%"/>
    <text class="banner-title">{{item.title}}</text>
    </swiper-item>
    </block>
    </swiper>

    </view>

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com