如何使Python类可序列化?
一个简单的课程:
class FileItem:
def __init__(self, fname):
self.fname = fname
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能得到输出:
>>> import json
>>> my_file = FileItem('/foo/bar')
>>> json.dumps(my_file)
TypeError: Object of type 'FileItem' is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
没有错误(__CODE__)
我正在寻找一种优雅的方法,使用一些嵌套的dicts和列表(即javascript样式的对象语法)在dict上使用属性访问来获取数据.
例如:
>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}
Run Code Online (Sandbox Code Playgroud)
应该可以通过这种方式访问:
>>> x = dict2obj(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
bar
Run Code Online (Sandbox Code Playgroud)
我认为,如果没有递归,这是不可能的,但是什么是获得dicts的对象样式的好方法?
我有以下字符串
{"action":"print","method":"onData","data":"Madan Mohan"}
Run Code Online (Sandbox Code Playgroud)
我想反序列化为类的对象
class payload
string action
string method
string data
Run Code Online (Sandbox Code Playgroud)
我使用的是python 2.6和2.7
我正在尝试将数据从简单的对象图转换为字典.我不需要类型信息或方法,我不需要能够再次将它转换回对象.
我发现这个问题是关于从对象的字段创建字典,但它不会递归地执行.
对于python来说相对较新,我担心我的解决方案可能是丑陋的,或者说是unpythonic,或者是以某种模糊的方式打破,或者只是简单的旧NIH.
我的第一次尝试似乎工作,直到我尝试使用列表和字典,并且检查传递的对象是否有内部字典似乎更容易,如果没有,只是将其视为一个值(而不是做所有的实例检查) ).我以前的尝试也没有递归到对象列表中:
def todict(obj):
if hasattr(obj, "__iter__"):
return [todict(v) for v in obj]
elif hasattr(obj, "__dict__"):
return dict([(key, todict(value))
for key, value in obj.__dict__.iteritems()
if not callable(value) and not key.startswith('_')])
else:
return obj
Run Code Online (Sandbox Code Playgroud)
这似乎工作得更好,不需要例外,但我仍然不确定这里是否有案例,我不知道它在哪里落下.
任何建议将不胜感激.
首先介绍一些背景:我有一些相当简单的数据结构,它们作为json文件保存在磁盘上.这些json文件在不同语言和不同环境的应用程序(如Web前端和数据操作工具)之间共享.
对于我想要创建Python"POPO"(普通旧Python对象)的每个文件,以及每个项目的相应数据映射器类应该实现一些简单的CRUD行为(例如,save将序列化类并存储为json文件磁盘).
我认为一个简单的映射器(只知道基本类型)将起作用.但是,我担心安全问题.一些json文件将由Web前端生成,因此如果用户向我提供了一些糟糕的json,则可能存在安全风险.
最后,这里是简单的映射代码(在如何将JSON数据转换为Python对象中找到):
class User(object):
def __init__(self, name, username):
self.name = name
self.username = username
import json
j = json.loads(your_json)
u = User(**j)
Run Code Online (Sandbox Code Playgroud)
您看到了哪些可能的安全问题?
注意:我是Python的新手.
编辑:全部感谢您的评论.我发现我有一个json,我有2个数组,每个都有一个地图.不幸的是,当我得到更多这些时,这开始变得很麻烦.
我正在将问题扩展到将json输入映射到recordtype.原始代码来自:https://stackoverflow.com/a/15882054/1708349.因为我需要可变对象,所以我将其更改为使用namedlist而不是namedtuple:
import json
from namedlist import namedlist
data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: namedlist('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id
Run Code Online (Sandbox Code Playgroud)
它还安全吗?
我正在使用Jackson 解析器将 Java 对象解析为JSON。我正在使用以下代码为某些 java 对象强制添加 JSON 键。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({ @JsonSubTypes.Type(value = A.class, name = "a"),
@JsonSubTypes.Type(value = F.class, name = "f") })
Run Code Online (Sandbox Code Playgroud)
我也在 Python 中设置了相同的类。我想在 python 中做同样的事情。但不确定 python 中可用的这个 Jackson 注释的替代方法是什么。
我的要求是我必须向 REST API 发送 POST 请求。我需要将 java 对象序列化为 JSON。但是由于我的类结构有点不同,我没有在 Java 类中提到的所有 JSON 键。为了解决这个问题,我正在做的是,当它发现“A”对象是从 java 传递的时,我在 JSON 中添加“a”键。它对“F”对象做同样的事情。所以,我已经按照我上面提到的方式实现了解决方案。我想在 Python 中实现同样的事情。
是否有一些可用的 JSON 解析器与上面提到的相同,或者我必须遵循一些不同的方法?
这是我的JSON数据
[
{
"id":1,
"name":"abc",
"phone": "12345",
"Charecteristics": [
{
"id":1,
"name":"Good Looking",
"rating": "Average",
}
{
"id":2,
"name":"Smart",
"rating": "Excellent",
}
]
},
{ ... },
{ ... }
]
Run Code Online (Sandbox Code Playgroud)
我在Python中有两个类
class Character(object):
id = 0
name = ""
rating = ""
class Person(object):
id = 0
name = ""
phone = ""
Characteristics = []
Run Code Online (Sandbox Code Playgroud)
我需要解析JSON数据并实例化适当的类.类是不言自明的:即Person有一个Character类数组.
如何实例化这些并适当地存储数据?
另外,我将如何访问特定的Person数据?即人的细节和特征
我试图从api调用api.trends()[Tweepy]返回的JSON对象中提取数据,但我无法提取数据.
任何人都可以给我一个如何从JSON对象中提取数据的示例.我想以表格形式提取数据.
提前致谢.
我想知道是否可以使用attrs库将嵌套的 JSON 转换为 Python 类实例,以便我可以通过点符号 ( object.attribute.nested_attribute)访问该 JSON 中的属性。
我的 JSON 有一个固定的架构,我可以手动定义该架构的类,但我不确定是否可以将 JSON 转换为嵌套类结构而不必实例化每个嵌套对象个别。我基本上是在寻找一个fromdict()知道(基于键)将 JSON 对象转换为哪个类的函数。
(我也知道还有其他方法可以构建“DotDicts”,但这些对我来说似乎总是有点老套,可能需要进行彻底的测试来验证它们是否正常工作。)
我想要Json到Python类.
例
{'channel':{'lastBuild':'2013-11-12', 'component':['test1', 'test2']}}
self.channel.component[0] => 'test1'
self.channel.lastBuild => '2013-11-12'
Run Code Online (Sandbox Code Playgroud)
你知道json转换的python库吗?
我使用 json 数据创建了一个命名空间,如下所示,从这个SO 答案中学到
>>> from __future__ import print_function
>>> import json
>>> from types import SimpleNamespace as Namespace
>>> data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'
>>> x = json.loads(data, object_hook=lambda d: Namespace(**d))
>>> x.name
'John Smith'
Run Code Online (Sandbox Code Playgroud)
但是如果“名称”来自一个变量,我该如何访问它?
>>> foo='name'
>>> x.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'types.SimpleNamespace' object has no attribute 'foo'
>>>
Run Code Online (Sandbox Code Playgroud) 与SeismicPortal的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"
}
}
Run Code Online (Sandbox Code Playgroud)
我想将字符串中的数据转换为python对象.
正如您在JSON数据中看到的那样,有很多嵌套.当我定义类及其嵌入性来构建一个结构的on对象时,它将保存来自JSON的所有数据,我想也许有一些神奇的Python函数jsonStringToObject可以定制一个类,所有子类都需要保存所有的JSON中的数据并创建它的实例.
让我们在变量rawData中有原始的JSON字符串:
rawData = """{"action":"create","data":{"geometry": {"type": "Point","coordinates": [... """
Run Code Online (Sandbox Code Playgroud)
现在我必须这样做:
>>> import json
>>> quake = json.loads(rawData)
>>> quake['data']['properties']['flynn_region']
"OXACA_MEXICO"
Run Code Online (Sandbox Code Playgroud)
但语法是用括号和撇号填充的.
我希望我可以像这样访问数据: …
python ×12
json ×9
annotations ×1
class ×1
datamapper ×1
dictionary ×1
jackson ×1
java ×1
object ×1
parsing ×1
python-2.6 ×1
python-3.6 ×1
python-3.x ×1
python-attrs ×1
simplejson ×1
string ×1
tweepy ×1