JSON(JavaScript Object Notation)始于 JavaScript 编程语言,是一种基于纯文本的数据格式。由于其结构简单易于人读写,易于程序解析与生成,已经成为独立标准广泛使用。在JSON格式中,有两种数据结构:一种是数组(array),用中括号表述,用于保存有序数据;另一种是对象(object),用大括号表述,用于保存键值对数据。如:[1, 2, 3] 和 {"key1" : 1, "key2" : 2, "key3" : 3}。
JSON数组(图片来自json.org)
JSON对象(图片来自json.org)
关于JSON的更详细介绍,参见:https://www.json.org/json-zh.html
JSON格式广泛用于 Web API 服务,在C、Java、Python等编程语言中都有很好的支持。但是很可惜,一直以来在 App Inventor 中只有“列表”与JSON的数组对应,缺少一种表述键值对的“字典”类型跟JSON的对象对应。为了表述JSON对象,App Inventor 定义了一种特殊的”双层列表“,也叫“键值对列表”。先创建一个列表,其中有2个元素,分别是“键”和“值”,再将这个列表放到另一个列表中。以JSON的格式表述就是:[["key1", 1], ["key2", 2], ["key3", 3]]。
例如在“HTTP客户端”组件中用双层列表表述请求的数据:
9102年过去后,MIT App Inventor 2 开发团队接受@data1013的提交,加入“字典”类型。感谢MIT App Inventor 2 开发团队和@data1013的贡献。App Inventor WxBit 汉化增强版第一时间跟进,经过2周的内测,“字典”类型正式上线。感谢 @浮云(https://www.kevinkun.cn/)等VIP会员的测试反馈。
使用字典结构后,改进前面的发送请求方法如图所示:
相比“双层列表”,使用字典让代码块看起来更加清晰。字典能自动转成“双层列表”,接收“列表”参数的卡口,都可以直接传入字典。比如“控制”分类的列表遍历块,也能用来遍历字典。
在“列表”和“字典”中,都有与JSON互转的块。“JSON转列表”块用于将JSON数组文本转为列表,而“JSON转字典”块用于将JSON对象文本转为字典(双层列表/键值对列表)。不可混淆。
这4个块,替代了HTTP客户端中的3个功能块。使用内置块,不需要增加组件。
“字典”块前面的功能,跟列表大同小异。下面重点介绍字典块的“键路径”,正确使用这个特性,能够大幅简化逻辑,减少代码块的数量。
“键路径”是一个单层列表,里面是字典的“键”或者列表的“索引”,最后一个块“本层的所有键”只能在“遍历字典”块的键路径列表中使用。
首先创建一个多层的班级成绩单字典:
后来我们发现X班的“郑十”同学不但没有缺考,还考了100分。如此更改成绩:
使用键路径,则可以简化为:
查询成绩:
遍历成绩单,选出X班所有同学的成绩:
键路径中的“本层的所有键”,选出了X班下所有同学的成绩。
在字典的层级很多时,使用键路径的优势会更加明显。
下面我们做个练习:利用字典和在线Web API,做个简单的城市天气预报。
组件设计如图:
逻辑设计如图:
连接AI伴侣之后,可以看到调试信息输出,及AI伴侣的预览:
例子的天气数据来自国家气象局,所用的API并未获得实时天气,下面这个地址可获得城市的实时天气数据,留待读者改进:http://flash.weather.com.cn/wmaps/xml/guangzhou.xml
提示:替换城市拼音获取其他城市的实时天气,使用HTTP客户端组件将XML解析成字典更方便使用。
参见错误:
1、文本不是JSON对象
需要是大括号({})包围的键值对文本。才能解析成JSON对象。
2、文本不是JSON数组
需要是中括号([])包围的列表文本,才能解析成JSON数组。
原文链接:App Inventor 进阶:“列表”与“字典”,转载请注明来源!