使用Retrofit和RxJava读取嵌套JSON对象遇到问题
嘿,我懂处理嵌套JSON时那种卡壳的感觉——尤其是层级一多,很容易搞不清怎么精准定位到想要的字段。我来给你拆解下你拿到的这个响应结构,再用几种常用语言举实操例子,帮你顺利搞定数据读取~
先拆解你的JSON结构
你拿到的是一个数组,数组里包含一个对象,这个对象有两个核心部分:
- 直接字段:
num_id(数值类型) - 嵌套对象:
row,里面包含了地址、网站、地铁信息等所有业务字段
Python 读取示例
Python里用json模块解析后,就能像操作普通列表和字典一样访问嵌套字段:
import json # 假设response_text是服务器返回的原始JSON字符串 response_text = '''[ { "num_id": 1, "row": { "coord_shirota": "59.932723", "www": "www.anichkov.ru", "metro": "Гостиный Двор", "description": "Старейшее здание на Невском проспекте, императорская резиденция", "address_manual": "Санкт-Петербург, Невский просп., 39 лит. А", "obj_history": "", "oid": "3285", "work_time": "пн-сб 10:00-18:00", "ogrn": "2147483647123", "metro_distance": "584.0", "phone": "123456789" } } ]''' # 把JSON字符串转成Python可操作的列表/字典 data = json.loads(response_text) # 读取外层的num_id num_id = data[0]['num_id'] print(f"编号: {num_id}") # 读取row里的具体字段,比如地址和网站 address = data[0]['row']['address_manual'] website = data[0]['row']['www'] print(f"地址: {address}") print(f"官网: {website}")
JavaScript 读取示例
不管是浏览器端还是Node.js,用JSON.parse解析后,通过点语法或者方括号语法就能访问嵌套字段:
// 假设response是服务器返回的原始JSON字符串 const response = `[ { "num_id": 1, "row": { "coord_shirota": "59.932723", "www": "www.anichkov.ru", "metro": "Гостиный Двор", "description": "Старейшее здание на Невском проспекте, императорская резиденция", "address_manual": "Санкт-Петербург, Невский просп., 39 лит. А", "obj_history": "", "oid": "3285", "work_time": "пн-сб 10:00-18:00", "ogrn": "2147483647123", "metro_distance": "584.0", "phone": "123456789" } } ]`; // 解析JSON为JS对象 const data = JSON.parse(response); // 读取外层的num_id const numId = data[0].num_id; console.log(`编号: ${numId}`); // 读取row里的描述和地铁信息 const description = data[0].row.description; const metro = data[0].row.metro; console.log(`建筑描述: ${description}`); console.log(`临近地铁: ${metro}`);
避坑小技巧
处理嵌套JSON最容易踩的坑就是字段缺失或者数组为空导致报错,给你两个实用小技巧:
- 安全访问字段
- Python里用
get()方法,即使字段不存在也不会报错,还能设置默认值:# 安全获取电话字段,不存在则返回"未提供" phone = data[0].get('row', {}).get('phone', '未提供') print(f"电话: {phone}") - JavaScript里用可选链操作符
?.,配合||设置默认值:// 安全获取电话字段,不存在则返回"未提供" const phone = data[0]?.row?.phone || '未提供'; console.log(`电话: ${phone}`);
- Python里用
- 先判断数组是否为空
如果服务器返回的数组可能没有元素,一定要先判断长度,避免访问data[0]时报错:if len(data) > 0: # 再进行后续的字段读取操作 passif (data.length > 0) { // 再进行后续的字段读取操作 }
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

