最近刚接触到python,就想到了如何反序列化json串。网上找了一下,大部分都是用json模块反序列化为python数据结构(字典和列表)。如果对json模块不了解的参考菜鸟教程。然后我在此基础上将python数据转换为了自定义类对象。

下面是测试代码及运行结果:

  1. import Json.JsonTool
  2.  
  3. class Score:
  4. math = 0
  5. chinese = 0
  6.  
  7. class Book:
  8. name = ''
  9. type = ''
  10.  
  11. class Student:
  12. id = ''
  13. name = ''
  14. score = Score()
  15. books = [Book()]
  16.  
  17. student = Student()
  18.  
  19. json_data = '{"id":"123", "name":"kid", "score":{"math":100, "chinese":98}, ' \
  20. '"books":[{"name":"math", "type":"study"}, ' \
  21. '{"name":"The Little Prince", "type":"literature"}]} '
  22. Json.JsonTool.json_deserialize(json_data, student)
  23.  
  24. print(student.name)
  25. print(student.score.math)
  26. print(student.books[1].name)
  27.  
  28. input("\n按回车键退出。")

运行结果:

  1. kid
  2. 100
  3. The Little Prince
  4.  
  5. 按回车键退出。

实现代码如下:

  1. import json
  2.  
  3. def json_deserialize(json_data, obj):
  4. py_data = json.loads(json_data)
  5. dic2class(py_data, obj)
  6.  
  7. def dic2class(py_data, obj):
  8. for name in [name for name in dir(obj) if not name.startswith('_')]:
  9. if name not in py_data:
  10. setattr(obj, name, None)
  11. else:
  12. value = getattr(obj, name)
  13. setattr(obj, name, set_value(value, py_data[name]))
  14.  
  15. def set_value(value, py_data):
  16. if str(type(value)).__contains__('.'):
  17. # value 为自定义类
  18. dic2class(py_data, value)
  19. elif str(type(value)) == "<class 'list'>":
  20. # value为列表
  21. if value.__len__() == 0:
  22. # value列表中没有元素,无法确认类型
  23. value = py_data
  24. else:
  25. # value列表中有元素,以第一个元素类型为准
  26. child_value_type = type(value[0])
  27. value.clear()
  28. for child_py_data in py_data:
  29. child_value = child_value_type()
  30. child_value = set_value(child_value, child_py_data)
  31. value.append(child_value)
  32. else:
  33. value = py_data
  34. return value

Python: Json串反序列化为自定义类对象的更多相关文章

  1. 类对象序列化为json串,json串反序列化为类对象

    1.类对象序列化为json串: 方法一: class P(object): def __init__(self,name,age,sex): self.name=name self.age=age s ...

  2. [K/3Cloud]将JSON字符串反序列化为C#动态对象

    using Kingdee.BOS.Util; string errString="{/"Row/":1,/"PageId/":/"1234 ...

  3. Python: 自定义类对象序列化为Json串

    之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonTool class Score: math = ...

  4. 将JSON字符串反序列化为指定的.NET对象类型

    目录导航: 前言: 方法一.在项目中定义对应的对象参数模型,用于映射反序列化出来的参数(复杂JSON字符串数据推荐使用): 方法二.直接将JSON字符串格式数据反序列化转化为字典数据(简单JSON字符 ...

  5. C# Json数据反序列化为Dictionary并根据关键字获取指定值1

    Json数据: { "dataSet": { "header": { "returnCode": "0", " ...

  6. C# Json数据反序列化为Dictionary并根据关键字获取指定值

    Json数据: { "dataSet": { "header": { "returnCode": "0", " ...

  7. 将Dictionary序列化为json数据 、json数据反序列化为Dictionary

    需要引用System.Web.Extensions  dll类库 /// <summary> /// 将json数据反序列化为Dictionary /// </summary> ...

  8. C#:Json数据反序列化为Dictionary并根据关键字获取指定的值

    转自曾是土木人原文 C#:Json数据反序列化为Dictionary并根据关键字获取指定的值 Json数据: { "dataSet": { "header": ...

  9. Gson把json串转换成java实体对象

    Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...

随机推荐

  1. luoguP4512 【模板】多项式除法 NTT+多项式求逆+多项式除法

    Code: #include<bits/stdc++.h> #define maxn 300000 #define ll long long #define MOD 998244353 # ...

  2. 郑晔谈 Moco 框架的开发:写一个好的内部 DSL ,写一个表达性好的程序

    作者:张龙 出处:http://www.infoq.com/cn/news/2013/07/zhengye-on-moco 郑晔谈Moco框架的开发:写一个好的内部DSL,写一个表达性好的程序 作者  ...

  3. 如何在React-Native上使用Typescript

    首先安装脚手架: $ yarn global add create-react-native-app 创建项目: create-react-native-app xxx 进入项目并启动: cd xxx ...

  4. Codeforces 675B Restoring Painting

    链接:传送门 题意:给出3 × 3的方块,其中任意2 × 2的方块和左上角2 × 2的和相等,还给出9个格子中的4个--a,b,c,d ,在1~n中选择一些数(可重复)填入剩下5个格子中,问有多少种填 ...

  5. 小学生都能学会的python(生成器)

    小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...

  6. 华硕VX50V开机老是进入bios

    问题:华硕VX50V开机老是进入bios 如图: 解决办法: 1.将   Boot  中的--->>  Lunch CSM  ---->>设置为  -->> ena ...

  7. C#-C#6.0新特性

    来自为知笔记(Wiz)

  8. server.htaccess 具体解释以及 .htaccess 參数说明

    .htaccess文件(或者"分布式配置文件")提供了针对文件夹改变配置的方法. 即.在一个特定的文档文件夹中放置一个包括一个或多个指令的文件, 以作用于此文件夹及其所有子文件夹. ...

  9. iOS KVC(Key-Value Coding)

    常见用法: 获取值 valueForKey: 依据属性名取值 valueForKeyPath: 依据路径取值(如:[person valueForKeyPath:@"car.price&qu ...

  10. 关于Javakeywordsynchronized——单例模式的思考

    精彩的设计模式盛宴刚刚落下帷幕.三天的时间.真是学习到了非常多.当中,遗留的非常多的问题.今天就谈谈synchronized这个keyword.关于对synchronizedkeyword的思考是从单 ...