Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python轻松进行JSON编码_Python_Json_Serialization - Fatal编程技术网

使用Python轻松进行JSON编码

使用Python轻松进行JSON编码,python,json,serialization,Python,Json,Serialization,我对python非常陌生(我使用Python3),我试图用一个字符串和两个列表作为JSon中的成员序列化一个类。我发现python标准中有一个json库,但似乎需要手动实现一个序列化方法。是否有一个JSon编码器,在这里我可以简单地传递一个对象,并以字符串形式接收序列化对象,而无需实现序列化方法。 例如: 谢谢。上课怎么样 更新 我一定跳过了关于类中包含的数据的部分。如果您希望在不需要扩展编码器的情况下对任意Python对象进行合理的序列化,那么您可以使用和json的组合。酸洗时,使用proto

我对python非常陌生(我使用Python3),我试图用一个字符串和两个列表作为JSon中的成员序列化一个类。我发现python标准中有一个json库,但似乎需要手动实现一个序列化方法。是否有一个JSon编码器,在这里我可以简单地传递一个对象,并以字符串形式接收序列化对象,而无需实现序列化方法。 例如:

谢谢。

上课怎么样

更新


我一定跳过了关于类中包含的数据的部分。如果您希望在不需要扩展编码器的情况下对任意Python对象进行合理的序列化,那么您可以使用和
json
的组合。酸洗时,使用protocol=0将数据序列化为人类可读的ASCII。

您希望
json
库如何序列化任意类

在您的情况下,如果您的类足够简单,您可能能够避开类似的问题

foo = FooObject() # or whatever
json_string = json.dumps(foo.__dict__)
foo_data = json.loads(json_string)
foo = FooObject(**foo_data)
只序列化对象的成员

然后,反序列化需要类似于

foo = FooObject() # or whatever
json_string = json.dumps(foo.__dict__)
foo_data = json.loads(json_string)
foo = FooObject(**foo_data)

不知道任何预先构建的东西,但如果对象足够简单,您可以编写一个。重写JSONECODER中的默认方法以查看inspect.getmembers(obj)(inspect是获取
\uuuu dict\uuuu
中属性集的一种更可读的方法)


更新:@Alexandre Deschamps说,对于某些输入,isroutine比is方法工作得更好。

Python版本重要吗?我的意思是,你能在2.x中实现它,但在3.0中却不能实现它吗?是的,大多数库似乎已经从2.x更改为3。不过,我需要编码一个类,而不仅仅是一个简单的类型或数组。此类似乎需要手动定义的序列化方法才能序列化类。也许我是错的,因为我对这门语言不太熟悉,但当我测试时,我得到了这个结论。
pickle
的人类可读性思想是:
(I_umain_uuu映射p0(dp1 s'towers'p2)(lp3)(I_umain_u'Tower p4)(dp5 s'attack'p6 I10 sbasS'crows'p7(lp8 s'one string in a list'p9 asb)。
与JSON相比,这几乎是人类可读的“可打印”为“人类可读”"。我的观点是,如果协议0 pickle坚持使用JSON来洗牌python对象,那么它可以被安全地序列化为JSON字符串。不,它似乎不起作用,因为我的类有两个成员,一个字符串和一个字符串列表。这对我来说很有效:。如果你的对象实际上只有两个成员,一个字符串和一个字符串列表,然后序列化就可以工作了。我使用的反序列化技术依赖于对象的
\uuuu init\uuuu
函数来获取与成员同名的参数。请参见上面的要点以获得一个工作示例。@WillMcCutchen感谢使用
dict
的灵感。我想做类似的事情,尽管我的对象(来自SOAP请求)没有调用
dict(soapObj)的
dict(soapObj)方法
给了我一个打印精美的JSON字符串。我也是python新手,这不是一个显而易见的技术,所以我很高兴你提到了它!谢谢你的anwser,它几乎做到了这一点,除了两件事。is_not_方法=lambda o:not inspect.ismethod(o)似乎也需要not inspect.isroutine(o)语句。在python中,内置方法似乎是一种极限情况。另外,我的类需要一个列表进行序列化。列表中的元素似乎没有用它进行序列化。@Alexandre Deschamps:我不知道你的意思……如果你将
\uu main\uuuuu
中的那些数字更改为数字列表,它就可以序列化了。好的,我知道了st发现问题出在我身上。我使用了{}而不是[]来创建一个列表。正如我所说的,我对该语言是新手。它工作正常。只需添加“not inspect.isroutine”以防其他人需要。非常感谢您的时间。@Alexandre Deschamps:啊!这不是一个列表,这是一个
set
数据类型。它没有顺序,因此没有到JSON数据类型的直接映射。如果坚持使用
If isinstance(拒绝,设置):返回列表(拒绝)
在这里,它会起作用——它只会给结果JSON数组中的集合中的值分配一个任意顺序