吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 362|回复: 6
收起左侧

[其他求助] 小白不懂json求解答

[复制链接]
liweiqing 发表于 2026-5-24 17:01
25吾爱币
本帖最后由 liweiqing 于 2026-5-24 17:03 编辑

有没有大佬解答一下。
https://www.juhe.cn/ 聚合数据
取不了数据,不知道啥原因哦



[Asm] 纯文本查看 复制代码
.版本 2
.支持库 
.子程序 取JSON值, 文本型
.参数 原始文本, 文本型
.参数 键名, 文本型
.局部变量 开始标记, 文本型
.局部变量 结束位置, 整数型
.局部变量 结果, 文本型
.局部变量 起始索引, 整数型
.局部变量 值起始位置, 整数型
 
开始标记 = #引号 + 键名 + #引号 + “:”
起始索引 = 寻找文本 (原始文本, 开始标记, , 假)
.如果真 (起始索引 = -1)
    返回 (“”)
.如果真结束
值起始位置 = 起始索引 + 取文本长度 (开始标记) + 1
结果 = 取文本中间 (原始文本, 值起始位置, 取文本长度 (原始文本))
结束位置 = 寻找文本 (结果, #引号, , 假)
.如果真 (结束位置 > 0)
    返回 (取文本左边 (结果, 结束位置 - 1))
.如果真结束
返回 (“”)
.子程序 _获取天气_被单击
.局部变量 网址, 文本型
.局部变量 返回文本, 文本型
.局部变量 http, 对象
.局部变量 key, 文本型
.局部变量 错误码, 文本型
.局部变量 区域, 文本型
.局部变量 调试输出, 文本型

key = “”
.如果真 (城市.内容 = “”)
    信息框 (“错误:请输入查询地区”, 0, , )
    返回 ()
.如果真结束
区域 = 城市.内容
网址 = “https://apis.juhe.cn/simpleWeather/query?key=” + key + “&city=” + 区域
调试输出 = 网址
http.创建 (“WinHttp.WinHttpRequest.5.1”, )
http.方法 (“Open”, “GET”, 网址, 假)
http.方法 (“Send”, )
返回文本 = http.读文本属性 (“ResponseText”, )
调试输出 (返回文本)
日期.内容 = 取JSON值 (返回文本, “result.realtime.date”)  
地区.内容 = 区域 + “市”   
气象.内容 = 取JSON值 (返回文本, “result.realtime.info”)   
气温.内容 = 取JSON值 (返回文本, “result.realtime.temperature”) + “℃”

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xichong 发表于 2026-5-24 19:50
访问聚合数据官网,注册一个账号并登录,在网站上找到“天气预报查询”或相关的免费 API 服务。申请开通该服务,系统会为你生成一个唯一的 Key(一串字母和数字的组合)。
将你获取到的 Key 填入代码的 key 变量中。


.子程序 _获取天气_被单击
.局部变量 网址, 文本型
.局部变量 返回文本, 文本型
.局部变量 http, 对象
.局部变量 key, 文本型
.局部变量 错误码, 文本型
.局部变量 区域, 文本型
.局部变量 调试输出, 文本型

// 将这里的空字符串替换为你在聚合数据网站上申请到的实际 Key
key = “你的实际Key在这里”

.如果真 (城市.内容 = “”)
    信息框 (“错误:请输入查询地区”, 0, , )
    返回 ()
.如果真结束

区域 = 城市.内容
网址 = “https://apis.juhe.cn/simpleWeather/query?key=” + key + “&city=” + 区域
调试输出 = 网址
http.创建 (“WinHttp.WinHttpRequest.5.1”, )
http.方法 (“Open”, “GET”, 网址, 假)
http.方法 (“Send”, )
返回文本 = http.读文本属性 (“ResponseText”, )
调试输出 (返回文本)

// 注意:下面这行代码可能也需要调整
日期.内容 = 取JSON值 (返回文本, “result.realtime.date”)  
 楼主| liweiqing 发表于 2026-5-24 20:02
xichong 发表于 2026-5-24 19:50
访问聚合数据官网,注册一个账号并登录,在网站上找到“天气预报查询”或相关的免费 API 服务。申请开通该 ...

日期.内容 = 取JSON值 (返回文本, “result.realtime.date”)
地区.内容 = 区域 + “市”  
气象.内容 = 取JSON值 (返回文本, “result.realtime.info”)  
气温.内容 = 取JSON值 (返回文本, “result.realtime.temperature”) + “℃”
就是这几个位置抽不出数据

我原来的代码调试输入的出来
{
  "reason": "查询成功!",
  "result": {
    "city": "深圳",
    "realtime": {
      "temperature": "30",
      "humidity": "73",
      "info": "多云",
      "wid": "01",
      "direct": "西南风",
      "power": "5-6级",
      "aqi": "21"
    },
    "future": [
      {
        "date": "2026-05-24",
        "temperature": "26/32℃",
        "weather": "多云",
        "wid": {
          "day": "01",
          "night": "01"
        },
        "direct": "南风转微风"
      },
      {
        "date": "2026-05-25",
        "temperature": "27/32℃",
        "weather": "多云",
        "wid": {
          "day": "01",
          "night": "01"
        },
        "direct": "西南风转微风"
      },
      {
        "date": "2026-05-26",
        "temperature": "26/33℃",
        "weather": "多云",
        "wid": {
          "day": "01",
          "night": "01"
        },
        "direct": "微风"
      },
      {
        "date": "2026-05-27",
        "temperature": "26/33℃",
        "weather": "多云",
        "wid": {
          "day": "01",
          "night": "01"
        },
        "direct": "微风"
      },
      {
        "date": "2026-05-28",
        "temperature": "26/33℃",
        "weather": "多云",
        "wid": {
          "day": "01",
          "night": "01"
        },
        "direct": "微风"
      }
    ]
  },
  "error_code": 0
}
这是我取出的json数据
xichong 发表于 2026-5-24 20:04
liweiqing 发表于 2026-5-24 20:02
日期.内容 = 取JSON值 (返回文本, “result.realtime.date”)
地区.内容 = 区域 + “市”  
气象. ...

修改代码中的JSON路径,去掉中间的 .realtime 这一层,直接从 result 对象下提取数据看看。
kaka1899 发表于 2026-5-26 15:28
1. 你key是空的

代码里 key = "",根本没填。聚合数据那个key是你自己申请的,去他们后台找到 “简单天气” 的 AppKey,复制过来粘进去。

2. 网址别用 https,用 http

你写的是 https://apis.juhe.cn/...,人家官方给的接口是 http,直接改过来就行。

3. 城市名没编码,中文直接怼上去不行

你传的是 &city=苏州,这种中文浏览器会自动处理,但你用 WinHttp 发的话,得先编码成 %E8%8B%8F%E5%B7%9E 这种形式。

怎么弄? 加一句:

易语言
区域_编码 = 编码_URL编码 (城市.内容, , 真)   ' 第三个参数真代表UTF-8
网址 = “http://apis.juhe.cn/simpleWeather/query?key=” + key + “&city=” + 区域_编码
4. 你那个自己撸的取JSON函数不太靠谱

你现在自己用找字符串的方式去扣数据,万一返回的JSON结构变了、或者出现嵌套,直接就跪了。建议别费劲了,去用现成的 JSON 解析模块,像 zyJson 这种,网上随便下。

替换完你的代码大概就这样:

易语言
.版本 2
.支持库 zyJsonValue

.子程序 _获取天气_被单击
.局部变量 json, zyJsonValue
.局部变量 返回文本, 文本型
' ...请求部分不变...

json.解析 (返回文本)
如果 (json.取文本 (“error_code”) = “0”)
    日期.内容 = json.取文本 (“result.realtime.date”)
    气象.内容 = json.取文本 (“result.realtime.info”)
    气温.内容 = json.取文本 (“result.realtime.temperature”) + “℃”
否则
    信息框 (“接口返回错误,错误码:” + json.取文本 (“error_code”), 0, )
结束如果
总结:
key没填,地址写错,中文没编码,自己写的解析不稳。
顺序改:填 key → 换 http → 城市名编码 → 换 JSON 模块,肯定能行。
改完还不行就抓包看下返回的原始数据里面 error_code 是多少,对照聚合的文档找原因。
 楼主| liweiqing 发表于 2026-5-30 14:58
kaka1899 发表于 2026-5-26 15:28
1. 你key是空的

代码里 key = "",根本没填。聚合数据那个key是你自己申请的,去他们后台找到 “简单天 ...

不行耶,调试输出也是能够出数据 就是取不出来文本
liu1203 发表于 2026-6-1 10:01
原因一:缺少 API Key
你的代码中有一句 key = “”。
聚合数据(juhe.cn)的所有接口都必须携带有效的 AppKey 才能请求成功。如果 Key 为空或者错误,服务器不会返回天气数据,而是会返回一段类似这样的错误 JSON:
{"reason":"错误的请求KEY","result":null,"error_code":10001}

解决方法:你需要登录聚合数据官网,申请“简单天气”接口,获取你专属的 AppKey,并填入代码中,例如 key = “1234567890abcdef...”。


原因二:你的自定义 取JSON值 函数不支持“路径式”取值
这是你代码里最隐蔽的 Bug。
看你的 取JSON值 子程序,它的逻辑是:纯文本寻找。
当你调用 取JSON值 (返回文本, “result.realtime.info”) 时,你的子程序拼接出的搜索条件是:
"result.realtime.info":

但是,聚合数据返回的真实 JSON 结构是层级嵌套的,长这样:

JSON
{
    "result": {
        "realtime": {
            "info": "晴",
            "temperature": "20"
        }
    }
}
返回的文本里根本不存在 "result.realtime.info": 这一长串连续的字符串,所以 寻找文本 会返回 -1,最终导致你取到的内容全部是空文本。

临时补救方案(不推荐):直接传最底层的键名,比如 取JSON值 (返回文本, “info”)。

正确解决方案(强烈推荐):放弃用字符串查找来解析 JSON,改用精易模块中的 类_json。

原因三:URL 中的中文未编码 以及 编码转换问题
中文 URL 编码:你直接将中文城市名(如“北京”)拼接到 URL 中。标准的 HTTP 请求中,URL 包含中文极易导致请求失败,需要进行 URL 编码(URLEncode)。

UTF-8 转 ANSI:聚合数据的接口返回的文本是 UTF-8 编码,而易语言的组件(如编辑框内容)默认是 ANSI (GBK) 编码。如果不做转换,即使取到了数据,显示出来的也会是乱码。



写易语言处理网络请求和 JSON,强烈建议引入“精易模块”(目前易语言开发者的标配)。引入后,你的代码可以精简并完美运行。

这是为你重写的正确代码示例(需要你在易语言中引用精易模块):

代码段
.版本 2
.支持库 spec

.子程序 _获取天气_被单击
.局部变量 网址, 文本型
.局部变量 返回文本, 文本型
.局部变量 key, 文本型
.局部变量 区域, 文本型
.局部变量 区域编码, 文本型
.局部变量 json, 类_json
.局部变量 错误码, 整数型

key = “在此处填入你在聚合数据申请的真实Key” ' 【必须填写】
.如果真 (城市.内容 = “”)
    信息框 (“错误:请输入查询地区”, 0, , )
    返回 ()
.如果真结束
区域 = 城市.内容

' 1. 对中文城市进行URL编码 (精易模块命令)
区域编码 = 编码_URL编码 (区域, 真, 真)

网址 = “https://apis.juhe.cn/simpleWeather/query?key=” + key + “&city=” + 区域编码
调试输出 (“请求网址: ”, 网址)

' 2. 发送GET请求 (使用精易模块的 网页_访问_对象,它会自动处理UTF8转码)
返回文本 = 编码_utf8到gb2312 (到文本 (网页_访问_对象 (网址, 0, , , , , , , , , , , , , , , , , )))
调试输出 (“返回文本: ”, 返回文本)

' 3. 解析JSON (使用精易模块的 类_json)
.如果真 (json.解析 (返回文本) = 假)
    信息框 (“JSON解析失败!”, 0, , )
    返回 ()
.如果真结束

错误码 = json.取属性数值 (“error_code”)
.如果 (错误码 ≠ 0)
    ' 接口返回了错误,比如Key错误、超限制等
    信息框 (“获取失败: ” + json.取通用属性 (“reason”), 0, , )
.否则
    ' 接口返回成功,按路径读取数据 (注意:聚合简单天气接口 realtime 里没有 date 字段,所以去掉了日期的读取)
    地区.内容 = 区域 + “市”   
    气象.内容 = json.取通用属性 (“result.realtime.info”)   
    气温.内容 = json.取通用属性 (“result.realtime.temperature”) + “℃”
.如果结束
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-9 11:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表