项目实战之跨语言调用api——结合语言优点解决实际问题

前情提要

在一个项目开发中需要后端解析并分析数据得出结果报告,一开始用的Java后端,后面一堆Json数据解析的实在头疼,于是捡起老胶水:Python 辅助开发作为后端的核心算法部分服务接口

Java:SpringBoot 结合 RestTemplate 调用服务接口

后端解析完数据通过RestTemplate发送http请求

Python:如何解析到手的嵌套Json数据

这一串又臭又长的Json数据结构是这样的:数组元素是Json对象,对象中又有元素项是数组,数组中管理的又有是对象的存在。简述就是数组对象俄罗斯套娃,需求又是拿到里面的一两个元素项下的值,下面是一小段数据例子

[{'desc': 'https://special-item-501508.framer.app/', 'deviceGroupId': 1, 'envAttr': {'browser': {'displayName': 'Browser', 'order': '11', 'value': 'Chrome'}, 'city': {'displayName': 'City', 'order': '4', 'value': 'Tucheng'}, 'country': {'displayName': 'Country or Region', 'order': '2', 'value': 'China'}, 'deviceType': {'displayName': 'Device Type', 'order': '18', 'value': 'PC'}, 'displayHeight': {'displayName': 'Screen Height', 'order': '13', 'value': 2234}, 'displayWidth': {'displayName': 'Screen Width', 'order': '12', 'value': 3456}, 'ip': {'displayName': 'IP', 'order': '1', 'value': '103.156.242.195'}, 'operatingSystem': {'displayName': 'OS', 'order': '9', 'value': 'Mac'}, 'province': {'displayName': 'Province', 'order': '3', 'value': 'Taipei'},  ..... 'pageAttr': {'clientCreateTs': {'displayName': '', 'value': 1701427202179}, 'libVersion': {'displayName': 'SDK Version', 'order': '22', 'value': '1.4.0'}, 'referrer': {'displayName': 'Previous URL', 'order': '15', 'value': 'https://framer.com/'}, 'referrerHost': {'displayName': 'Previous Domain', 'order': '16', 'value': 'framer.com'}, 'sdkType': {'displayName': 'SDK Type', 'order': '21', 'value': 'WEB'}, 'sessionId': {'displayName': '', 'order': '', 'value': 877}, 'title': {'displayName': 'Page Title', 'order': '10', 'value': 'SaaS Template'}, 'uri': {'displayName': 'Page URI', 'order': '12', 'value': 'https://special-item-501508.framer.app/'}, 'url': {'displayName': 'Page URL', 'order': '11', 'value': 'https://special-item-501508.framer.app/'}, 'urlHost': {'displayName': 'Page Domain', 'order': '13', 'value': 'special-item-501508.framer.app'}, 'urlPath': {'displayName': 'Page Path', 'order': '14', 'value': '/'}}, ...}

这一段给Java解析想想我都头疼,这时候就想起了这门“很随便”的语言:Python。解析数据的代码如下

@app.route('/reslove_json', methods=['POST'])
def reslove_json():
    data = request.json
    print(data)
    if data:
        # 遍历data数组
        for item in data:
            print(f"'desc': {item['desc']}")
            # 如果数组元素中存在'envAttr'
            if 'envAttr' in item:
                envAttr = item['envAttr']
                print(f"'browser': {envAttr.get('browser')}")

    return jsonify({'code': '200', 'msg': '请求成功!', 'data': 'succeed'})

运行结果如下

 

拓展

如果Json数据对象格式不统一,又该怎么办呢?下面代码给出示例:

data = [  
    {  
        "id": 1,  
        "obj": {  
            "name": "John Doe",  
            "age": 30  
        }  
    },  
    {  
        "id": 2,  
        "details": {  
            "name": "Jane Doe",  
            "age": 25  
        }  
    }  
]  
  
# 使用列表推导来获取所有的'name'值  
names = [item['obj'].get('name', None) if 'obj' in item else item['details'].get('name', None) for item in data]  

# 上面列表推导式等同于以下代码
for item in data:
    if 'obj' in item:
        name = item['obj'].get('name', None);
    else
        name = item['details'].get('name', None);


print(names)

遍历data列表中的每个字典对象。对于每个对象,我们检查它是否包含obj键,如果包含,我们就从obj字典中获取name的值;如果不包含obj键但包含details键,我们就从details字典中获取name的值。如果name键不存在于任何子字典中,get方法将返回None

用列表推导式的一个优点是相比于for循环更高效,因为列表推导式在执行时调用的是Python的底层C代码,而for循环则是用Python代码来执行。

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值