从 Json 字符串创建 Python 对象 [重复]

2023-11-30

WebSocket 连接到地震门户网站正在向我发送有关地震的数据,这些数据打包在 JSON 对象中,我将其作为多行字符串获取,例如:

{                                                                                                                                                                                               
    "action": "create",                                                                                                                                                                         
    "data": {                                                                                                                                                                                   
        "geometry": {                                                                                                                                                                           
            "coordinates": [                                                                                                                                                                    
                -95.12,                                                                                                                                                                         
                16.52,                                                                                                                                                                          
                -52.0                                                                                                                                                                           
            ],                                                                                                                                                                                  
            "type": "Point"                                                                                                                                                                     
        },                                                                                                                                                                                      
        "id": "20180303_0000046",                                                                                                                                                               
        "properties": {                                                                                                                                                                         
            "auth": "UNM",                                                                                                                                                                      
            "depth": 52.0,                                                                                                                                                                      
            "evtype": "ke",                                                                                                                                                                     
            "flynn_region": "OAXACA, MEXICO",                                                                                                                                                   
            "lastupdate": "2018-03-03T10:26:00.0Z",                                                                                                                                             
            "lat": 16.52,                                                                                                                                                                       
            "lon": -95.12,                                                                                                                                                                      
            "mag": 4.0,                                                                                                                                                                         
            "magtype": "m",                                                                                                                                                                     
            "source_catalog": "EMSC-RTS",                                                                                                                                                       
            "source_id": "652127",                                                                                                                                                              
            "time": "2018-03-03T07:09:05.0Z",                                                                                                                                                   
            "unid": "20180303_0000046"                                                                                                                                                          
        },                                                                                                                                                                                      
        "type": "Feature"                                                                                                                                                                       
    }                                                                                                                                                                                           
}

我想将字符串中的数据转换为 python 对象。

正如您在 JSON 数据中看到的,存在大量嵌套。当我定义类及其嵌入性以构建一个结构的对象时,该结构将保存 JSON 中的所有数据,我在想也许有一些神奇的 Python 函数json字符串转对象这将定制一个类和所有需要保存 JSON 中的所有数据并创建它的实例的子类。

让我们将原始 JSON 字符串放入变量 rawData 中:

rawData = """{"action":"create","data":{"geometry": {"type": "Point","coordinates": [... """

现在我必须这样做:

>>> import json
>>> quake = json.loads(rawData)
>>> quake['data']['properties']['flynn_region']
"OXACA_MEXICO"

但语法中充满了括号和撇号。

我希望我可以像这样访问数据:

>>> import json    
>>> quake = jsonStringToObject(rawData)
>>> quake.data.properties.flynn_region
"OXACA_MEXICO"

您可以为此创建自己的类。使用__getitem__, and __setitem__从对象中获取和更新值__dict__使用点符号:

import json

class PyJSON(object):
    def __init__(self, d):
        if type(d) is str:
            d = json.loads(d)
        self.convert_json(d)

    def convert_json(self, d):
        self.__dict__ = {}
        for key, value in d.items():
            if type(value) is dict:
                value = PyJSON(value)
            self.__dict__[key] = value

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __getitem__(self, key):
        return self.__dict__[key]

rawData = """... raw data ..."""

quake = PyJSON(rawData)

按预期工作:

>>> quake.data.properties.flynn_region
'OAXACA, MEXICO'

EDIT: Added to_dict并被覆盖__repr__因此更容易查看控制台中的值。更名convert_json to from_dict.

import json

class PyJSON(object):
    def __init__(self, d):
        if type(d) is str:
            d = json.loads(d)

        self.from_dict(d)

    def from_dict(self, d):
        self.__dict__ = {}
        for key, value in d.items():
            if type(value) is dict:
                value = PyJSON(value)
            self.__dict__[key] = value

    def to_dict(self):
        d = {}
        for key, value in self.__dict__.items():
            if type(value) is PyJSON:
                value = value.to_dict()
            d[key] = value
        return d

    def __repr__(self):
        return str(self.to_dict())

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __getitem__(self, key):
        return self.__dict__[key]

rawData = """... raw data ..."""

quake = PyJSON(rawData)

Before:

>>> quake.data.geometry
<__main__.PyJSON object at 0xADDRESS>

After:

>>> quake.data.geometry
{'coordinates': [-95.12, 16.52, -52.0], 'type': 'Point'}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Json 字符串创建 Python 对象 [重复] 的相关文章

随机推荐

  • 序列化 Drawable 时出现问题

    我有一个对象 它具有三个字段 两个字符串和一个Drawable public class MyObject implements Serializable private static final long serialVersionUID
  • 按作者列出类别〜WITH COUNTER〜(Wordpress)

    这是我得到的代码 它给出了给定作者已发表的类别的列表 但是 我非常希望类别名称旁边有一个数字 告诉作者在不同类别中发表了多少篇文章 有谁知道一个技巧吗 谢谢
  • 无需安装即可使用 SqlServer CE

    Given 干净的机器 不存在 SQL Server CE 一组 sdf 文件 Sql Server CE 数据库 不管它们是如何到达那里的 相关 Sql Server CE 的 DLL sqlceca35 dll sqlcecompact
  • 使用 angularjs 过滤两个选定日期之间的表数据时出现问题

    我正在根据两个选定的日期过滤表格内容 它确实过滤了日期 但结果不正确 dateRange Filter 写在控制器中 生产控制员 angular module app controller ProductionController scop
  • 如何即时播放非 PCM 文件或将其转换为 PCM?

    以下代码适用于某些 wav 文件 但适用于其他文件时 我得到 InvalidOperationException 未处理 Message Sound API 仅支持播放 PCM 波形文件 var webClient new WebClien
  • 在 Java 中将一系列图像转换为视频?

    目前 功能原型拥有工作所需的一切 一个半透明窗口 可以轻松调整您想要记录的位置的大小 多个线程来管理屏幕截图等 但我需要它完成的最后一项任务却没有完成我几个月了 我需要转换所有转储到我创建的文件夹中的图像temp 一切完成后我将其删除 放入
  • 如何在 PHP 中从 csv 文件中提取数据

    我有一个 csv 文件 如下所示 lines 0 text with commas another text 123 text 5 lines 1 some without commas another text 123 text line
  • 赋值和序列点:这怎么有歧义?

    考虑 C 代码a a a 没有用于赋值的序列点 因此此代码在编译有关未定义操作的警告时会产生警告a 可能的值是什么a这里可以有吗 这好像是a不可能改变价值观 这里实际上是否存在未定义的行为 或者编译器只是懒惰 序列点违规的未定义行为规则对于
  • 将图像添加到 JavaFX TableView 列中

    我是 Java 和 OOP 新手 并且陷入了向 tableview 列添加图像的困境 代码似乎有效 我可以看到学生的姓名正确 但图像未显示在列中 我收到此错误并且无法理解如何使其工作 javafx scene control cell Pr
  • 如何清除内容而不收到可怕的“停止运行此脚本”?对话?

    在 Windows 窗体中 某些控件上有 BeginUpdate EndUpdate 对 我想要类似的东西 但是对于 jQuery 我有一个 div 里面有一个 div 像这样 div class column div div div 在内
  • 解决 Android 不再支持的 Canvas.clipPath() 问题

    从安卓3 0开始剪辑路径 打开硬件加速的设备不再支持该方法 阅读本文article更多细节 我正在使用画布 我需要绘制圆形图像 关于我该如何做到这一点有什么想法吗 我无法关闭硬件加速 我正在寻找其他解决方案 回答 Tnx Malcolm 寻
  • ShapeDrawable 作为 Android 中评级栏的 ProgressDrawable?

    看来我无法将 ShapeDrawable 设置为 Ratingbar 的 ProgressDrawable 我尝试了以下方法但失败了
  • 我尝试将 Spring 的默认记录器更改为 log4j2 有什么问题吗?

    我是 Spring Boot 的新手 我想将默认记录器更改为 log4j2 因为它比 logback 具有更高的吞吐量 这是我的 Gradle 脚本 如您所见 我使用的是 Spring Boot 2 0 3 为了禁用默认记录器 我在 Spr
  • BluetoothChat 示例:NullPointerException [重复]

    这个问题在这里已经有答案了 可能的重复 getActionBar 返回 null 完全的安卓菜鸟 我正在尝试从 Galaxy S3 运行 BluetoothChat 示例 但它似乎在应用程序运行时崩溃了 这是 LogCat 输出 09 14
  • DataReader 为 null 或为空

    Using C 我有一个数据读取器 它从 mysql 数据库返回记录列表 我正在尝试编写代码来检查数据读取器是否为空 其背后的逻辑是 如果数据读取器有字段 则显示信息 否则隐藏该字段 我努力了 cmd1 new OdbcCommand Se
  • R 经济衰退日期转换

    我正在通过 R 将衰退带数据下载到 R 中quantmod 现在 这是一个二进制信息 xts 格式 看起来像这样 仅显示第一个衰退期 1857 01 01 0 1857 02 01 0 1857 03 01 0 1857 04 01 0 1
  • 使用反射动态地使用其名称检索静态变量

    如何使用 Java 反射动态地使用名称来检索静态变量 如果我有包含一些变量的类 public class myClass final public static string cfg1 01 02 81 82 final public st
  • Python3:尝试在非包中进行相对导入

    我对这个基本问题感到非常抱歉 因为它类似于 被相对进口所困扰 但我正在尝试遵循 PEP328http www python org dev peps pep 0328 guido s decision这对我不起作用 这些是我的文件 dev
  • Python - Pxssh - 尝试登录远程服务器时出现密码拒绝错误

    我正在尝试使用 pexpect 模块 pxssh 登录我的一台服务器 我的密码被拒绝 我想我知道问题是什么 但不知道如何解决 问题是 当我登录服务器时有一个欢迎横幅 无法更改横幅 并且预期会感到困惑 这是我的代码 import pxssh
  • 从 Json 字符串创建 Python 对象 [重复]

    这个问题在这里已经有答案了 WebSocket 连接到地震门户网站正在向我发送有关地震的数据 这些数据打包在 JSON 对象中 我将其作为多行字符串获取 例如 action create