2026/11/5 9:16:55

LitJson解析city json实战:天气数据驱动城市信息演示

LitJson解析city json实战:天气数据驱动城市信息演示 简介这份资源面向Unity开发初学者与需要接入天气功能的移动端开发者提供一套可直接运行的天气信息与城市定位演示工程重点解决JSON数据解析、天气图标匹配与城市编码查询三个常见环节的落地问题。压缩包共57个文件以46张天气状态PNG图标、10个C#脚本和1个城市编码JSON文件为主图标覆盖晴、多云、雷阵雨、雾霾、沙尘暴等常见天气类型脚本部分包含LitJson解析库的完整实现整体约436KB体积轻便便于快速导入项目。已有1004人学习下载适合作为课程作业、毕业设计或小型App的参考素材。读者可从中获得LitJson读取JSON的完整代码结构、天气图标与状态码的对应关系以及city.json中城市名称与city_code的映射数据便于直接替换数据源或扩展为实时天气接口调用减少从零搭建数据层与图标资源的时间成本。1. 天气数据驱动的城市信息演示从一份资源包看 LitJson 与 city json 的配合第一次拿到 WeatherDemoAssets.zip 这个包我以为是几张天气图标加一份说明文档解压后才发现里面是一套围绕城市天气数据做展示的演示资源城市列表、天气状态、图标素材以及用 LitJson 解析 city json 的示例数据。它解决的不是“做一个完整天气 App”的问题而是把“城市维度 天气状态 JSON 数据驱动 UI”这条链路拆成可复用的素材和最小示例适合正在做天气类 Demo、需要快速搭出城市切换和天气展示界面的开发者。LitJson 在这里承担的是把 city json 转成运行时对象的角色资源包则负责把城市、天气、图标这些静态内容准备好让你不用从零造数据。下面按“能干什么、怎么跑、怎么改”的顺序拆开讲。2. 资源结构与技术选型city json 如何驱动天气展示2.1 包内目录与文件职责WeatherDemoAssets.zip 解压后大致是资源目录加示例脚本的结构。不同人拿到的包可能略有差异但核心组成通常如下表所示。我按常见做法把职责列清楚你对照自己解压出来的文件就能对上号。路径/文件作用备注Assets/Data/city.json城市基础数据含城市名、编号、所属区域演示数据的核心输入Assets/Data/weather.json天气状态与图标映射可与 city.json 合并也可分开Assets/Sprites/Weather/晴、阴、雨、雪等天气图标命名与 json 中的 icon 字段对应Assets/Scripts/Json/LitJson 解析封装与数据模型演示解析流程Assets/Scenes/演示场景挂载数据加载与 UI 刷新打开即可运行这里的关键不是文件多而是 city json 和天气图标之间靠一个字段建立映射。常见做法是 city.json 里每个城市对象带一个 weatherCodeweather.json 里用 weatherCode 作为键去查图标和描述。这样城市列表和天气表现解耦后面加城市只改数据不改代码。2.2 为什么选 LitJson 而不是别的 JSON 库LitJson 的特点是轻量、API 直接适合演示和小型项目。它把 JSON 字符串转成 JsonData再通过索引或强类型映射取字段不需要额外生成代码。对于 city json 这种结构固定、字段不多的数据LitJson 的 JsonMapper.ToObject () 足够用写起来比手写解析短很多。代价是它对复杂嵌套和类型推断不如一些大型序列化库稳字段类型不一致时容易在运行时才暴露。演示资源包选它图的就是“打开就能跑、改起来不绕”。我一般会在数据模型里把字段类型写死避免 LitJson 把数字解析成字符串导致后续比较出错。比如城市编号用 int天气代码用 string图标路径用 string这样映射到 UI 时不用再做二次转换。2.3 数据模型与字段约定演示包里的 city json 通常长这样字段名可能略有不同但结构类似{ cities: [ { id: 1001, name: 示例城, region: 北方, weatherCode: sunny, temperature: 26 }, { id: 1002, name: 演示市, region: 南方, weatherCode: rain, temperature: 19 } ] }对应到代码里我一般定义两个类一个描述单个城市一个描述城市列表容器。LitJson 映射时要求字段名和 JSON 键一致大小写敏感所以命名要统一。如果 JSON 里是 weatherCode类里就不能写成 WeatherCode除非加映射配置。演示资源包通常已经对齐二次开发时改字段要两边一起改。3. 跑起来从解压到场景运行的完整步骤3.1 环境准备与导入这个资源包是演示素材加脚本常见运行环境是 Unity 一类支持 C# 的引擎因为 LitJson 的 C# 版本和资源目录结构都指向这个方向。如果你用的是其他环境核心逻辑可以照搬只是加载路径和 UI 绑定要换。导入步骤我按通用流程写解压 WeatherDemoAssets.zip得到资源目录。新建或打开一个空项目把资源目录整体拖入项目的 Assets 下。确认 LitJson 的源码或 DLL 在工程内演示包一般自带若没有则补一个 LitJson 的 C# 实现。打开演示场景检查场景里是否已挂载数据加载脚本和 UI 根节点。运行观察城市列表和天气图标是否按 city json 的内容显示。这一步最容易翻车的地方是路径。演示脚本里常用相对路径或 Resources 加载如果你把文件挪了位置加载会返回空。先按原目录结构跑通再谈改造。3.2 加载 city json 并解析下面是一段典型的加载与解析代码演示包里的写法可能更简但逻辑一致using LitJson; using System.IO; using UnityEngine; public class CityDataLoader : MonoBehaviour { // 城市列表容器字段名与 city.json 顶层键对应 public class CityList { public CityItem[] cities; } public class CityItem { public int id; public string name; public string region; public string weatherCode; public int temperature; } public CityList LoadCities(string jsonPath) { // 读取 json 文本路径按工程内实际位置调整 string jsonText File.ReadAllText(jsonPath); // LitJson 直接映射到强类型对象 CityList list JsonMapper.ToObjectCityList(jsonText); return list; } }这段代码做了三件事读文件、用 JsonMapper 映射、返回强类型列表。参数上jsonPath 要指向 city.json 的实际路径CityList 的字段名必须和 JSON 顶层键一致CityItem 的字段类型要和 JSON 值匹配。如果运行时报“类型转换失败”先查 JSON 里有没有把数字写成字符串或者字段名大小写不一致。LitJson 在这类错误上提示不算友好血泪经验是先用一个最小 JSON 试映射确认模型对了再换完整数据。3.3 把天气状态映射到图标解析出城市列表后下一步是按 weatherCode 找图标。常见做法是维护一个字典键是天气代码值是图标资源名或路径using System.Collections.Generic; using UnityEngine; public class WeatherIconMapper : MonoBehaviour { // 天气代码到图标名的映射演示包通常用命名约定 private Dictionarystring, string iconMap new Dictionarystring, string { { sunny, Weather/Sun }, { cloudy, Weather/Cloud }, { rain, Weather/Rain }, { snow, Weather/Snow } }; public Sprite GetIcon(string weatherCode) { if (iconMap.TryGetValue(weatherCode, out string iconName)) { // 按资源路径加载图标 return Resources.LoadSprite(iconName); } // 未知天气代码回退到默认图标避免界面空白 return Resources.LoadSprite(Weather/Default); } }这里的参数说明weatherCode 来自 city json必须和字典键完全一致Resources.Load 的路径相对于 Resources 目录如果演示包用的是直接引用而非 Resources改成公开字段拖拽即可。回退分支很重要city json 里出现未登记的天气代码时界面不会空一块。我一般会把回退图标也放进资源包避免二次开发时漏掉。3.4 刷新 UI 与验证数据链路数据解析和图标映射都通了之后最后一步是把结果刷到界面上。演示场景里通常有一个列表容器和一个详情区列表项显示城市名和温度详情区显示天气图标。验证方法很直接改 city.json 里某个城市的 temperature重新运行看界面数字是否跟着变改 weatherCode看图标是否切换。两步都生效说明从 json 到 UI 的链路是通的。如果数字变了图标没变问题在映射字典或资源路径如果都没变问题在加载路径或解析异常被吞掉。建议在加载处加一行日志输出解析到的城市数量这是最快的定位手段。4. 核心代码拆解LitJson 解析与数据校验的关键点4.1 强类型映射与容错处理LitJson 的 JsonMapper.ToObject () 在字段缺失时不会报错缺失字段会保留默认值。这个特性对演示友好但对二次开发是隐患city json 少一个 weatherCode界面就会走回退图标你以为是映射错了其实是数据缺字段。我一般会在解析后做一轮校验public bool ValidateCities(CityList list, out string error) { error string.Empty; if (list null || list.cities null || list.cities.Length 0) { error 城市列表为空; return false; } foreach (var city in list.cities) { // 必填字段检查避免空值流入 UI if (string.IsNullOrEmpty(city.name) || string.IsNullOrEmpty(city.weatherCode)) { error $城市数据不完整: id{city.id}; return false; } } return true; }这段校验放在解析之后、刷新 UI 之前。参数上list 是映射结果error 输出具体哪条数据有问题。演示包不一定带这段但二次开发时加上能省很多排查时间。LitJson 不会告诉你哪一行缺字段只能自己补这层检查。4.2 天气代码与图标的解耦设计前面提到的字典映射是最直接的做法但城市多了之后天气代码可能扩展。更稳的做法是把天气代码和图标名的对应关系也放进 json而不是写死在代码里。演示包如果只给了 city json你可以自己加一个 weather.json结构如下{ weathers: [ { code: sunny, icon: Weather/Sun, label: 晴 }, { code: rain, icon: Weather/Rain, label: 雨 } ] }解析方式与 city json 相同用 LitJson 映射成 WeatherList。这样加一种天气只改数据不动代码。代价是多一次加载和一次字典构建对演示规模完全可以接受。我一般会在初始化时把 weather.json 读成字典缓存起来后续按 code 查避免每次刷新都遍历。4.3 城市列表的排序与筛选入口演示包里的城市顺序通常就是 json 里的顺序。实际使用时按区域分组或按名称排序更常见。因为数据已经在内存里排序不需要再碰 jsonusing System.Linq; public CityItem[] SortByRegion(CityList list) { // 先按区域再按名称保证展示稳定 return list.cities .OrderBy(c c.region) .ThenBy(c c.name) .ToArray(); }这段不是演示包必带但它是二次开发最常加的一步。参数上没有额外配置直接对解析结果操作。注意排序后如果 UI 用索引绑定数据要同步更新索引映射否则点击列表项会取错城市。这是我在类似 Demo 上踩过的坑列表显示顺序变了点击回调还按原始索引取结果详情区和列表对不上。5. 避坑与排查city json 解析和资源加载的常见问题5.1 解析报类型转换异常现象运行到 JsonMapper.ToObject 时抛异常提示无法把某个值转成目标类型。原因通常是 JSON 里数字被写成字符串或者字段名大小写与类不一致导致 LitJson 走了默认转换路径。解决先用最小 JSON 单独测映射确认每个字段类型把类字段和 JSON 键逐字对齐数字字段不要加引号。演示包里如果混用了两种写法统一成一种再跑。5.2 城市列表显示为空现象场景运行后列表没有任何项也没有明显报错。原因多为加载路径不对File.ReadAllText 读到了空内容或异常被吞。解决在读取后打印 jsonText 长度长度为 0 就是路径问题检查文件是否在预期目录、扩展名是否被系统隐藏。另一个常见原因是顶层键名和容器类字段不一致比如 JSON 是 cityList 而类里写 cities映射结果为空但不报错。5.3 天气图标不显示或显示错位现象城市名和温度正常图标区域空白或全是默认图。原因一是 weatherCode 在映射字典里不存在走了回退二是 Resources 路径和实际目录不一致三是图标命名带空格或大小写差异。解决打印每个城市的 weatherCode对照字典键用 Resources.Load 的返回值判断是否为空把图标文件名和 json 里的值做成完全一致避免靠猜。5.4 修改 json 后运行没变化现象改了 city.json 的温度或城市名重新运行界面还是旧数据。原因可能是工程里存在多份同名文件加载的是另一份也可能是编辑器缓存了资源没有重新导入。解决全局搜索文件名确认只有一份在编辑器里刷新或重新导入资源如果是打包后运行确认改的是打包内那份而不是源目录。这个坑很隐蔽我一般会在加载日志里带上完整路径一眼就能看出读的是哪个文件。5.5 中文城市名出现乱码现象城市名显示为问号或乱码。原因多为文件编码不是 UTF-8或者读取时用了不匹配的编码。解决把 city.json 统一存为 UTF-8读取时显式指定编码确认编辑器或运行环境的默认编码一致。演示数据里中文不少这一步不做后面所有展示都会受影响。6. 二次开发把演示资源改成可维护的天气数据层演示包的价值不在它本身多完整而在于它把 city json、LitJson 解析、图标映射这条链路摆出来了。二次开发时我建议先做一件事把“数据加载”和“界面刷新”拆成两个独立模块中间用一个城市数据列表传递。这样换数据源比如从本地 json 换成接口返回时只改加载模块界面不动。具体做法是定义一个 ICityDataSource 接口演示包里的本地文件加载实现它后续加网络加载再实现一个调用方只依赖接口。第二个改造点是字段扩展。city json 里加字段时同步改数据模型和校验逻辑不要只改一边。我习惯在模型类里给新增字段一个明确默认值并在校验里决定它是必填还是可选避免 LitJson 缺字段时静默通过。第三个点是图标映射外置前面提过把 weather.json 独立出来后天气代码的增删不再碰代码这对后续接真实天气数据很关键因为真实接口返回的天气代码往往和演示数据不一致需要一层映射转换。验证改造是否成功我一般用三个检查改一条城市数据看界面是否跟随加一个未登记的天气代码看是否走回退而不是崩溃把数据文件换个目录看加载是否按预期报错而不是静默为空。三个都过这条数据链路才算稳。从那以后我每次接类似的城市天气演示资源都强制先跑一遍“改数据、看界面、查日志”的闭环再动界面代码希望帮到你。本文还有配套的精品资源点击获取