Python 3 中的json模块使用
1. 概述
JSON (JavaScript Object Notation)是一种使用广泛的轻量数据格式. Python标准库中的json
模块提供了JSON数据的处理功能.
Python中一种非常常用的基本数据结构就是字典(Dictionary). 它的典型结构如下:
d = {
'a': 123,
'b': {
'x': ['A', 'B', 'C']
}
}
而JSON的结构如下:
{
"a": 123,
"b": {
"x": ["A", "B", "C"]
}
}
可以看到, Dictionary和JSON非常接近, 而Python中的json
库提供的主要功能, 也是两者之间的转换.
2. 读取JSON
json.loads
方法可以将包含了一个JSON数据的str
, bytes
或者bytearray
对象, 转化为一个Python Dictionary. 它的完型接口签名如下:
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
2.1 最简单的例子
json.loads
最基本的使用方式就是将一个包含JSON数据的str
传递给这个方法:
>>> json.loads('{"a": 123}')
{'a': 123}
注意
在Python中, str
值可以放在一对单引号中, 也可以放在一对双引号中:
>>> 'ABC' == "ABC"
True
所以, 在定义Dictionary的str
类型的键和值的时候, 使用单引号或者双引号都是合法和等价的:
>>> {"a": 'ABC'} == {'a': "ABC"}
True
但是, 在JSON中, 字符串数据只能放在双引号中, 因而json.loads
方法处理的字符串的JSON内容中, 字符串必须使用双引号. 否则就会发生解码错误:
>>> json.loads("{'a': 123}")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
如果被处理的Python字符串是包含在双引号中的, 那么JSON中的双引号就需要转义:
>>> json.loads("{\"a\": 123}")
{'a': 123}
2.2 bytes
和bytearray
数据
对于内容是JSON数据的bytes
和bytearray
, json.loads
方法也可以处理:
>>> json.loads('{"a": 123}'.encode('UTF-8'))
{'a': 123}
>>> json.loads(bytearray('{"a": 123}', 'UTF-8'))
{'a': 123}
2.3 编码格式
json.loads
的第二个参数是encoding
没有实际作用.
由于Python 3中str
类型总是使用UTF-8编码, 所以s
参数为str
类型时, json.loads
方法自动使用UTF-8编码. 并且, str
不能以BOM字节开头.
当s
参数为bytes
或者bytearray
时, json.loads
方法会自动判断为UTF-8, UTF-16还是UTF-32编码. 默认也是将其按照UTF-8编码转化为str
对象进行后续处理.
2.4 数据类型转换
JSON可以表示四种主类型数据
字符串 string
数字 number
布尔类 boolean
空值 null
以及两结数据结构
对象 object
数组 array
默认实现中, JSON和Python之间的数据转换对应关系如下表:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
实际转换情况如下例:
>>> json.loads("""
... {
... "obj": {
... "str": "ABC",
... "int": 123,
... "float": -321.89,
... "bool_true": true,
... "bool_false": false,
... "null": null,
... "array": [1, 2, 3]
... }
... }""")
{'obj': {'str': 'ABC', 'int': 123, 'float': -321.89, 'bool_true': True, 'bool_false': False, 'null': None, 'array': [1, 2, 3]}}
对于JSON中数字number类型的数据, 有以下几点需要注意:
JSON中的实数real number类型的精度不能超过Python中的float类型的精度范围, 否则就有精度损失. 如下例:
>>> json.loads('3.141592653589793238462643383279')
3.141592653589793
JSON标准不包括非数字NaN, 正无穷Infinity和负无穷-Infinity, 但是
json.loads
方法默认会将JSON字符串中的NaN
,Infinity
,-Infinity
转化为Python中的float('nan')
,float('inf')
和float('-inf')
. 注意, 这里JSON中的NaN
,Infinity
,-Infinity
必须大小写正确并且拼写完整. 如下例>>> json.loads('{"inf": Infinity, "nan": NaN, "ninf": -Infinity}')
{'inf': inf, 'nan': nan, 'ninf': -inf}
2.5 自定义JSON对象转换类型
json.loads
默认将JSON中的对象数据转化为Dictionary类型, object_hook
参数可以用来改变构造出的对象.
object_hook
接受一个函数, 这个函数的输入参数为JSON中对象数据转化出的Dictionary对象, 其返回值则为自定义的对象. 如下例所示:
>>> class MyJSONObj:
... def __init__(self, x):
... self.x = x
...
>>> def my_json_obj_hook(data):
... print('obj_hook data: %s' % data)
... return MyJSONObj(data['x'])
...
>>> result = json.loads('{"x": 123}', object_hook=my_json_obj_hook)
obj_hook data: {'x': 123}
>>> type(result)
<class '__main__.MyJSONObj'>
>>> result.x
123
当JSON中的对象有嵌套时, json.loads
方法会按照深度优先的方式遍历对象树, 将各层的对象数据传递给object_hook
. 叶节点的JSON对象构造出的Python对象, 会作为父节点的一个值, 传递给父节点的object_hook
方法. 如下例:
>>> class MyJSONObj:
... def __init__(self, x, y):
... self.x = x
... self.y = y
...
>>> def my_json_obj_hook(data):
... print('obj_hook data: %s' % data)
... return MyJSONObj(**data)
...
>>> result = json.loads('{"x": {"x": 11, "y": 12}, "y": {"x": 21, "y":22}}', object_hook=my_json_obj_hook)
obj_hook data: {'x': 11, 'y': 12}
obj_hook data: {'x': 21, 'y': 22}
obj_hook data: {'x': <__main__.MyJSONObj object at 0x10417ef28>, 'y': <__main__.MyJSONObj object at 0x10417ed68>}
除了object_hook
参数以外, 还有一个object_pairs_hook
参数. 这个参数同样可以用来改变json.loads
方法构造出的Python对象的类型. 这个参数和object_hook
的不同, 在于传入的方法所接收到的输入数据不是一个Dictionary, 而是一个包含tuple
的list
. 每个tuple
都有两个元素, 第一个元素是JSON数据中的键, 第二个元素是这个键对应的值. 如JSON对象
{
"a": 123,
"b": "ABC"
}
对应的输入数据是
[
('a': 123),
('b', 'ABC')
]
当调用json.loads
方法时, 同时指定object_hook
和object_pairs_hook
, object_pairs_hook
会覆盖object_hook
参数.
2.6 自定义JSON数字转换类型
默认实现中, JSON中的实数被转换为Python的float
类型, 整数被转换为int
或者long
类型. 类似object_hook
, 我们可以通过parse_float
和parse_int
参数指定自定义的转换逻辑. 这两个方法的输入参数为表示JSON实数或者整数的字符串. 下例中, 我们将实数转换为numpy.float64
, 将整数转换为numpy.int64
:
>>> def my_parse_float(f):
... print('%s(%s)' % (type(f), f))
... return numpy.float64(f)
...
>>> def my_parse_int(i):
... print('%s(%s)' % (type(i), i))
... return numpy.int64(i)
...
>>> result = json.loads('{"i": 123, "f": 321.45}', parse_float=my_parse_float, parse_int=my_parse_int)
<type 'str'>(123)
<type 'str'>(321.45)
>>> type(result['i'])
<type 'numpy.int64'>
>>> type(result['f'])
<type 'numpy.float64'>
2.6.1 自定义NaN
, Infinity
和-Infinity
转换类型
由于标准JSON数据不支持NaN
, Infinity
和-Infinity
, 所以parse_float
并不会接收到这几个值. 当需要自定义这几个值转换的对象的时候, 就需要使用另外一个接口parse_constant
. 比如下例中, 将这几个值同样转换为numpy.float64
类型:
>>> def my_parse_constant(data):
... print('%s(%s)' % (type(data), data))
... return numpy.float64(data)
...
>>> result = json.loads('{"inf": Infinity, "nan": NaN, "ninf": -Infinity}', parse_constant=my_parse_constant)
<type 'str'>(Infinity)
<type 'str'>(NaN)
<type 'str'>(-Infinity)
>>> result['inf']
inf
>>> type(result['inf'])
<type 'numpy.float64'>
2.7 非对象顶级值
根据JSON规范, 一个JSON数据中, 可以只包含一个值, 而不是一个完整的对象. 这个值可以是一个字符串, 一个数字, 布尔值, 空值, 或者一个数组. 除了这三种JSON规范中给出的类型, 还可以是NaN
, Infinity
或者-Infinity
:
>>> json.loads('"hello"')
'hello'
>>> json.loads('123')
123
>>> json.loads('123.34')
123.34
>>> json.loads('true')
True
>>> json.loads('false')
False
>>> print(json.loads('null'))
None
>>> json.loads('[1, 2, 3]')
[1, 2, 3]
2.8 重复键名
在同一层级JSON对象中, 不应当出现重复的键名, 不过JSON规范中没有给出这种情况的处理标准. 在json.loads
中, 当JSON数据中有重复键名, 则后面的键值会覆盖前面的:
>>> json.loads('{"a": 123, "b": "ABC", "a": 321}')
{'a': 321, 'b': 'ABC'}
2.9 处理JSON数据文件
当JSON数据是保存在一个文件中的时候, json.load
方法可以用来从这个文件中读取数据, 并转换为Python对象. json.load
方法的第一个参数就是指向JSON数据文件的文件类型对象.
比如/tmp/data.json
文件的内含如下:
{
"a": 123,
"b": "ABC"
}
可以使用下例中的代码来读取并转化文件中的JSON数据:
>>> with open('/tmp/data.json') as jf:
... json.load(jf)
...
{u'a': 123, u'b': u'ABC'}
除了文件类型的对象, 只要是实现了read
方法的类文件对象, 都可以作为fp
参数, 比如下例中的io.StringIO
:
>>> sio = io.StringIO('{"a": 123}')
>>> json.load(sio)
{'a': 123}
json.load
方法的其他参数的意义和使用方法和上文中的json.loads
相同, 这里不再赘述.
3 生成JSON
json.dumps
方法可以将Python对象转换为一个表示JONS数据的字符串. 它的完整接口签名如下:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
它的第一个参数obj
即为要转换的数据对象.
>>> json.dumps({'a': 123, 'b': 'ABC'})
'{"a": 123, "b": "ABC"}'
3.1 编码格式
json.dumps
的ensure_ascii
参数用来控制生成的JSON字符串的编码. 其默认值为True
, 此时, 所有的非ASCII码字条都会转义. 如果不希望自动进行转义, 则会保持原有编码, 限UTF-8. 如下例所示:
>>> json.dumps({'数字': 123, '字符': '一二三'})
'{"\\u6570\\u5b57": 123, "\\u5b57\\u7b26": "\\u4e00\\u4e8c\\u4e09"}'
>>> json.dumps({'数字': 123, '字符': '一二三'}, ensure_ascii=False)
'{"数字": 123, "字符": "一二三"}'
3.2 数据类型转换
在默认实现中, json.dumps
可以处理的Python对象, 及其所有的属性值, 类型必须为dict
, list
, tuple
, str
, float
或者int
. 这些类型与JSON的数据转换关系如下表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int-&float-derived emuns | number |
True | true |
False | false |
None | null |
实际转换情况如下示例:
>>> json.dumps(
... {
... 'str': 'ABC',
... 'int': 123,
... 'float': 321.45,
... 'bool_true': True,
... 'bool_false': False,
... 'none': None,
... 'list': [1, 2, 3],
... 'tuple': [12, 34]
... }
... )
'{"str": "ABC", "int": 123, "float": 321.45, "bool_true": true, "bool_flase": false, "none": null, "list": [1, 2, 3], "tuple": [12, 34]}'
虽然JSON标准规范不支持NaN
, Infinity
和-Infinity
, 但是json.dumps
的默认实现会将float('nan')
, float('inf')
和float('-inf')
转换为常量NaN, Infinity, 和-Infinity. 如下例所示:
>>> json.dumps(
... {
... 'nan': float('nan'),
... 'inf': float('inf'),
... '-inf': float('-inf')
... }
... )
'{"nan": NaN, "inf": Infinity, "-inf": -Infinity}'
由于这些常量可能会导致生成的JSON字符串不能被其他的JSON实现处理, 为了防止这种情况出现, 可以将json.dumps
的allow_nan
参数设置为True
. 此时, 当处理的Python对象中出现这些值时, json.dumps
方法会抛出异常.
3.3 循环引用
json.dumps
方法会检查Python对象中是否有循环引用, 如果发现了循环引用, 就会抛出异常. 如下例所示:
>>> circular_obj = {}
>>> circular_obj['self'] = circular_obj
>>> circular_obj
{'self': {...}}
>>> json.dumps(circular_obj)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
ValueError: Circular reference detected
如果不希望json.dumps
方法检查循环引用, 可以将参数check_circular
设置为False
. 但如果此时Python对象中有循环引用, 有可能发生递归嵌套过深的错误或者其他错误, 这么做是比较危险的. 如下例所示:
>>> json.dumps(circular_obj, check_circular=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
RecursionError: maximum recursion depth exceeded while encoding a JSON object
3.4 JSON字符串输出格式
json.dumps
方法的indent
参数可以用来控制JSON字符串的换行和缩进效果.
indent
参数默认值为None
. 此时, JSON字符串不会有换行和缩进效果. 如下示:
>>> print(json.dumps({'a': 123, 'b': {'x': 321, 'y': 'ABC'}}))
{"a": 123, "b": {"x": 321, "y": "ABC"}}
当indent
为0或者负数时, JSON字符会包含换行:
>>> print(json.dumps({'a': 123, 'b': {'x': 321, 'y': 'ABC'}}, indent=-1))
{
"a": 123,
"b": {
"x": 321,
"y": "ABC"
}
}
>>> print(json.dumps({'a': 123, 'b': {'x': 321, 'y': 'ABC'}}, indent=0))
{
"a": 123,
"b": {
"x": 321,
"y": "ABC"
}
}
而当indent
为正整数时, 除了换行, JSON还会以指定数量的空格为单位在对象层次间进行缩进:
>>> print(json.dumps({'a': 123, 'b': {'x': 321, 'y': 'ABC'}}, indent=2))
{
"a": 123,
"b": {
"x": 321,
"y": "ABC"
}
}
indent
还可以是str
, 此时, JSON会以str
内容为单位进行缩进, 比如制表符\t
:
>>> print(json.dumps({'a': 123, 'b': {'x': 321, 'y': 'ABC'}}, indent='\t'))
{
"a": 123,
"b": {
"x": 321,
"y": "ABC"
}
}
json.dumps
的另外一个参数separators
可以用来设置输出的分隔符. 这个参数的值应当是一个有两个元素的tuple
. 其第一个值为成员间的分隔符, 第二个值为键值之间的分隔符. 其默认值也会随上文中的indent
参数影响. 当indent
为None
时, separators
的默认值为(', ', ': ')
, 即分隔符后都有一个空格. 当indent
不为None
时, 其默认值则为(',', ':')
, 即只有键值间分隔符后会有一个空格, 而元素间分隔符则不带空格, 因为此时会有换行.
separators
参数的一种可能的使用场景是希望移除所有的非必要格式字符, 以此来减小JSON字符串的大小. 此时可以将separator
设置为(',', ';')
, 并不设置indent
参数, 或者将其显式设置为None
:
>>> print(json.dumps({'a': 123, 'b': {'x': 321, 'y': 'ABC'}}, indent=None, separators=(',', ':')))
{"a":123,"b":{"x":321,"y":"ABC"}}
3.5 转换自定义Python对象
json.dumps
的默认实现只能转换Dictionary类型的对象. 如果想要转换自定义对象, 需要使用default
参数. 这个参数接收一个函数, 这个函数的参数是一个要转换的Python对象, 返回值是能够表示这个Python对象的Dictionary对象. default
函数会从对象引用树的顶层开始, 逐层遍历整个对象引用树. 因此, 不用自己实现对象树的遍历逻辑, 只需要处理当前层次的对象. 如下例所示:
>>> class MyClass:
... def __init__(self, x, y):
... self.x = x
... self.y = y
...
>>> def my_default(o):
... if isinstance(o, MyClass):
... print('%s.y: %s' % (type(o), o.y))
... return {'x': o.x, 'y': o.y}
... print(o)
... return o
...
>>> obj = MyClass(x=MyClass(x=1, y=2), y=11)
>>> json.dumps(obj, default=my_default)
<class '__main__.MyClass'>.y: 11
<class '__main__.MyClass'>.y: 2
'{"x": {"x": 1, "y": 2}, "y": 11}'
3.6 非字符串类型键名
在Python中, 只是可哈希(hashable)的对象和数据都可以做为Dictionary对象的键, 而JSON规范中则只能使用字符串做为键名. 所以在json.dumps
的实现中, 对这个规则进行了检查, 不过键名允许的范围有所扩大, str
, int
, float
, bool
和None
类型的数据都可以做为键名. 不过当键名非str
的情况时, 键名会转换为对应的str
值. 如下例:
>>> json.dumps(
... {
... 'str': 'str',
... 123: 123,
... 321.54: 321.54,
... True: True,
... False: False,
... None: None
... }
... )
'{"str": "str", "123": 123, "321.54": 321.54, "true": true, "false": false, "null": null}'
而当出现其他类型的键名时, 默认出抛出异常:
>>> json.dumps({(1,2): 123})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
TypeError: keys must be a string
json.dumps
的skipkeys
参数可以改变这个行为. 当将skipkeys
设置为True
时, 遇到非法的键名类型, 不会抛出异常, 而是跳过这个键名:
>>> json.dumps({(1,2): 123}, skipkeys=True)
'{}'
3.7 生成JSON文件
当需要将生成的JSON数据保存到文件时, 可以使用json.dump
方法. 这个方法比json.dumps
多了一个参数fp
, 这个参数就是用来保存JSON数据的文件对象. 比如, 下例中的代码
>>> with open('/tmp/data.json', mode='a') as jf:
... json.dump({'a': 123}, jf)
...
就会将JSON数据写入到/tmp/data.json
文件里. 代码执行完后, 文件内容为
{"a": 123}
json.dump
方法也可以接受其他类文件对象:
>>> sio = io.StringIO()
>>> json.dump({'a': 123}, sio)
>>> sio.getvalue()
'{"a": 123}'
json.dump
的其他参数和json.dumps
的用法相同, 这里不再赘述.
4 SON解码和编码类实现
json.loads
, json.load
, json.dumps
和json.dump
这四个方法是通过json.JSONDecoder
和json.JSONEncoder
这两个类来完成各自的任务的. 所以也可以直接使用这两个类来完成前文描述的功能:
>>> json.JSONDecoder().decode('{"a": 123}')
{'a': 123}
>>> json.JSONEncoder().encode({'a': 123})
'{"a": 123}'
json.loads
, json.load
, json.dumps
和json.dump
这个四个方法的参数主要都是传递给了json.JSONDecoder
和json.JSONEncoder
的构造方法, 所以使用这些方法可以满足绝大部分需求. 当需要自定义json.JSONDecoder
和json.JSONEncoder
子类的时候, 只需要将子类传递给cls
参数. 同时, 这些方法都有**kw
参数. 当自定义实现类的构造函数需要标准参数列表之外的新参数时, 这个参数就会将新参数传递给实现类的构造方法.
5 相关资源
- JSON
- The JavaScript Object Notation (JSON) Data Interchange Format - RFC 4627
- json — JSON encoder and decoder
Python 3 中的json模块使用的更多相关文章
- Python学习笔记:json模块和pickle模块(数据序列化)
Python中的json模块和pickle都是用于数据的序列化和反序列化,它们提供的方法也是一样的:dumps,dump,loads,load dumps(obj):将对象序列化为str. dump( ...
- Python编程中 re正则表达式模块 介绍与使用教程
Python编程中 re正则表达式模块 介绍与使用教程 一.前言: 这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用.这样就会有一个问题就是:随着俺 ...
- openresty开发系列25--openresty中使用json模块
openresty开发系列25--openresty中使用json模块 web开发过程中,经常用的数据结构为json,openresty中封装了json模块,我们看如何使用 一)如何引入cjson模块 ...
- Python中的json模块
在Python内置函数中,有一个eval()函数可以将字符串内容转换成Python对象,比如我现在将一个字典 dic = {"name":"pengfy"}写到 ...
- python中序列化json模块和pickle模块
内置模块和第三方模块 json模块和pickle 模块(序列化模块) 什么是序列化? 序列化就是将内粗这种的数据类型转成另一种格式 序列化:字典类型——>序列化——>其他格式——>存 ...
- python中的 json 模块使用
(1)python 中生成 json 字符串: import json data = dict(ret=0, msg="Welcome, Login success!") json ...
- Python中的Json模块dumps、loads、dump、load函数介绍
Json模块dumps.loads.dump.load函数介绍 1.json.dumps() json.dumps() 用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json ...
- Python序列化-pickle和json模块
Python的“file-like object“就是一种鸭子类型.对真正的文件对象,它有一个read()方法,返回其内容.但是,许多对象,只要有read()方法,都被视为“file-like obj ...
- python爬虫中的requests模块
Requests: 让 HTTP 服务人类 一.简介 虽然Python的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests ...
随机推荐
- CMake搜索Boost1.57失败及解决
CMake更新到3.1.0,Boost更新到1.57,结果CMake搜索Boost失败: Unable to find the Boost header files. Please set BOOS ...
- love~LBJ,奥布莱恩神杯3
时间:2016年6月20日8:00:地点:美国金州甲骨文(Oracle)球馆:事件:G7大战,又一次见证伟大赛季奥布莱恩神杯得主--金州勇士VS克利夫兰骑士...... 可以说,这是NBA以来 ...
- SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在动作或RPG类游戏中我们有时需要天黑和天亮过度的效果来完成场 ...
- 手动开发动态资源之servlet初步
1.1 静态资源和动态资源的区别 静态资源:当用户多次访问这个资源,资源的源代码永远不会改变的资源. 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变. 1.2动态资源的开发技术 Serv ...
- 12.1、Libgdx的图像之持续性和非持续性渲染
(官网:www.libgdx.cn) Libgdx在默认情况下,渲染现成调用render()方法进行持续性渲染.频率取决于你的硬件设备. 有时候有些游戏中并不需要持续性的渲染,为了省电,可以关掉持续性 ...
- pig读取部分列 (全部列中的少部分列)
pig流式数据,load数据时,不能读入任意列. 但是,可以从头读,只能连续几列.就是前几列.比如10列数据,可以只读前3列.但不能读第3列: 如:数据testdata [wizad@sr104 lm ...
- android:layout_alignleft layout_toleftof区别,详解RelativeLayout布局属性
转载请注明博客地址. 最近看博客看到有关于RelativeLayout布局的解释,有的解释很多是错误的.因此有必要对每一个常见的布局属性进行描述.以下解释全部都是逐行进行测试的. 首先把常用的布局分组 ...
- web多语言url的设计
因为项目要支持国际化,最近跟一个同事在讨论多语言版本下面url如何设计,假如我们需要支持en和cn的版本. 他倾向于支持如下的url格式,后续以格式1指代: /en/group/abc.html /c ...
- 四大组件之 BroadcastReceiver小结
总结提高,与君共勉 1. BroadcastReceiver是什么? BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播. ...
- 关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等
关于CKEditor的一个配置整理,改文件为config.js: 文件内容如下: /** * @license Copyright (c) 2003-2016, CKSource - Frede ...