Json decode: PHP: json_decode β€” Manual

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

json β€” ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ JSON β€” докумСнтация ΠΏΠΎ Python 3.11.4

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄: Lib/json/__init__.py


JSON (ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° JavaScript), ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ
RFC 7159 (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ замСняСт RFC 4627 ) ΠΈ
ЭКМА-404,
это ΠΎΠ±Π»Π΅Π³Ρ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ
Бинтаксис Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° JavaScript
(хотя это Π½Π΅ строгоС подмноТСство JavaScript 1 ).

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ остороТны ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… JSON ΠΈΠ· Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… источников. Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹ΠΉ
Π‘Ρ‚Ρ€ΠΎΠΊΠ° JSON ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ потрСбляСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ количСство рСсурсов ЦП ΠΈ памяти.
РСсурсы. РСкомСндуСтся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

json прСдоставляСт API, Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΠ°Ρ€ΡˆΠ°Π» ΠΈ ΠΏΠΈΠΊΠ» .

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Python:

 >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1. 0, 2]}]'
>>> print(json.dumps("\"foo\bar"))
"\"Ρ„Ρƒ\Π±Π°Ρ€"
>>> ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (json.dumps ('\ u1234'))
"\u1234"
>>> ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (json.dumps ('\\'))
"\\"
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"Π°": 0, "Π±": 0, "Π²": 0}
>>> ΠΈΠ· io ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ StringIO
>>> ΠΈΠΎ = StringIO()
>>> json.dump(['API ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ'], io)
>>> io.getvalue()
'["API ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ"]'
 

ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Π°Ρ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°:

 >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
 

ΠšΡ€Π°ΡΠΈΠ²Π°Ρ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ:

 >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, отступ=4))
{
    Β«4Β»: 5,
    Β«6Β»: 7
}
 

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ JSON:

 >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> ΠΈΠ· io ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ StringIO
>>> io = StringIO('["API ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ"]')
>>> json.load(io)
['API ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ']
 

БпСциализация дСкодирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² JSON:

 >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ json
>>> ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ as_complex(dct):
. .. Ссли '__complex__' в dct:
... Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ комплСкс (dct['real'], dct['imag'])
... Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π”ΠšΠŸ
...
>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
... object_hook=as_complex)
(1+2ΠΊ)
>>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ дСсятичного
>>> json.loads('1.1', parse_float=decimal.Decimal)
ДСсятичный ('1.1')
 

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ JSONEncoder :

 >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ json
>>> класс ComplexEncoder(json.JSONEncoder):
... ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (я, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚):
... Ссли isinstance (obj, комплСкс):
... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ [obj.real, obj.imag]
... # ΠŸΡƒΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ TypeError
... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ json.JSONEncoder.default(self, obj)
...
>>> json.dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[2.0', ', 1.0', ']']
 

ИспользованиС json.tool ΠΈΠ· ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ красивой ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ:

 $ эхо '{"json":"obj"}' | ΠΏΠΈΡ‚ΠΎΠ½-ΠΌ json.tool
{
    "json": "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚"
}
$ эхо '{1.2:3. 4}' | ΠΏΠΈΡ‚ΠΎΠ½-ΠΌ json.tool
ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ имя свойства, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ: строка 1 столбСц 2 (char 1)
 

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

JSON являСтся подмноТСством YAML 1.2. JSON, созданный
настройки этого модуля ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π² частности, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сСпараторы
value) Ρ‚Π°ΠΊΠΆΠ΅ являСтся подмноТСством YAML 1.0 ΠΈ 1.1. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ сСриализатор YAML.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠšΠΎΠ΄Π΅Ρ€Ρ‹ ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹ этого модуля ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ порядок Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°,
ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ тСряСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ нСупорядочСны.

ОсновноС использованиС

json.dump( obj , fp , * , skipkeys=False , sure_ascii=True , check_circular=True , allow_nan=Π˜ΡΡ‚ΠΈΠ½Π° , cls=НСт , отступ=НСт , Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ=НСт , default=НСт , sort_keys=Π›ΠΎΠΆΡŒ 90 063, **ΠΊΠ²Ρ‚ )

БСриализация obj Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON Π² fp (ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° . write()
Ρ„Π°ΠΉΠ»ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ прСобразования.

Если skipkeys ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: False ), Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ΠΈ dict, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅
Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ( str , int , float , bool ,
None ) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ TypeError .

ΠœΠΎΠ΄ΡƒΠ»ΡŒ json всСгда создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ str , Π° Π½Π΅
Π±Π°ΠΉΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, fp.write() Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ str
Π²Ρ…ΠΎΠ΄.

Если ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ_ascii истинно (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Π²Ρ‹Π²ΠΎΠ΄ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ
ΡΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС входящиС Π½Π΅-ASCII-символы. Если ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ_ascii Π΅ΡΡ‚ΡŒ
false, эти символы Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ.

Если check_circular ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: True ), Ρ‚ΠΎ ΠΊΡ€ΡƒΠ³ΠΎΠ²ΠΎΠΉ
ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ссылок для Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π°, Π° цикличСская ссылка
ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС RecursionError (ΠΈΠ»ΠΈ Ρ…ΡƒΠΆΠ΅).

Если allow_nan ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: True ), Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚
ValueError для сСриализации Π²Π½Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° float Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ( nan ,
inf , -inf ) Π² строгом соотвСтствии со спСцификациСй JSON.
Если allow_nan истинно, ΠΈΡ… эквивалСнты Π² JavaScript ( NaN ,
Infinity , -Infinity ).

Если отступ являСтся Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ числом ΠΈΠ»ΠΈ строкой, Ρ‚ΠΎ элСмСнты массива JSON ΠΈ
Ρ‡Π»Π΅Π½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ красиво Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Ρ‹ с этим ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ отступа. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ отступа
0, ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ "" Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ строки. НСт (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)
Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ прСдставлСниС. ИспользованиС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ цСлочислСнного отступа
отступов ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ. Если отступ являСтся строкой (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "\t" ),
эта строка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отступа ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня.

ИзмСнСно Π² вСрсии 3.2: Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ строки для с отступом Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ числам.

Если ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ (item_separator, key_separator)
ΠΊΠΎΡ€Ρ‚Π΅ΠΆ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (', ', ':') , Ссли отступ Ρ€Π°Π²Π΅Π½ НСт ΠΈ
(',', ':') ΠΈΠ½Π°Ρ‡Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ прСдставлСниС JSON,
Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ (',', ':') для устранСния ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².

ИзмСнСно Π² вСрсии 3.4: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ (',', ': ') ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли отступ Π½Π΅ Ρ€Π°Π²Π΅Π½ НСт .

Если ΡƒΠΊΠ°Π·Π°Π½ΠΎ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, которая вызываСтся для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅
ΠΈΠ½Π°Ρ‡Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сСриализован. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ JSON
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠΈΡ‚Π΅ Ошибка Ρ‚ΠΈΠΏΠ° . Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, TypeError
Поднялся.

Если sort_keys Ρ€Π°Π²Π½ΠΎ true (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: False ), Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄
словари Π±ΡƒΠ΄ΡƒΡ‚ отсортированы ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ подкласс JSONEncoder (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСопрСдСляСт
default() для сСриализации Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²), ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
класс ΠΊΠ²Π°Ρ€Π³; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ JSONEncoder .

ИзмСнСно Π² вСрсии 3.6: ВсС Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ pickle ΠΈ marshal , JSON Π½Π΅ являСтся Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ²Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ,
поэтому ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ
dump() с использованиСм Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ fp ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ созданию нСдопустимого Ρ„Π°ΠΉΠ»Π° JSON.

json.dumps( obj , * , skipkeys=False , sure_ascii=True , check_circular=True , allow_nan=True 9006 3, клс=НСт , отступ=Π½Π΅Ρ‚ , Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ=Π½Π΅Ρ‚ , ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ=Π½Π΅Ρ‚ , sort_keys=лоТь , **kw )

БСриализация obj Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON str с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого прСобразования
стол. АргумСнты ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ смысл, Ρ‡Ρ‚ΠΎ ΠΈ Π²
Π΄Π°ΠΌΠΏ() .

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠšΠ»ΡŽΡ‡ΠΈ Π² ΠΏΠ°Ρ€Π°Ρ… ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ JSON всСгда ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ str . Когда
ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ конвСртируСтся Π² JSON, всС ΠΊΠ»ΡŽΡ‡ΠΈ словаря
ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°ΡŽΡ‚ ΠΊ струнам. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого, Ссли ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ прСобразуСтся
Π² JSON, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ
ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ. Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ load(dumps(x)) != x , Ссли x ΠΈΠΌΠ΅Π΅Ρ‚ нСстроковый
ΠΊΠ»ΡŽΡ‡ΠΈ.

json.load( fp , * , cls=НСт , object_hook=НСт , parse_float=НСт , parse_int=НСт , 9 0062 parse_constant=НСт , object_pairs_hook=НСт , * *ΠΊΠ²Ρ‚ )

Π”Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ fp (ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ тСкстовый Ρ„Π°ΠΉΠ» .read() ΠΈΠ»ΠΈ
Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», содСрТащий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ JSON) Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Python, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ
эта Ρ‚Π°Π±Π»ΠΈΡ†Π° прСобразования.

object_hook β€” Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ
дСкодируСтся любой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Π» ( dict ). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
object_hook Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто dict . Π­Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, JSON-RPC
подсказка класса).

object_pairs_hook β€” Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ любого Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ упорядочСнного списка ΠΏΠ°Ρ€.
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ object_pairs_hook Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто
Π΄ΠΈΠΊΡ‚ . Π­Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠ².
Если object_hook Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, object_pairs_hook ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚.

ИзмСнСно Π² вСрсии 3.1: Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ​​поддСрТка object_pairs_hook .

parse_float , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ со строкой ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ JSON
float для дСкодирования. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это эквивалСнтно float(num_str) ..
Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для использования Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ парсСра для JSON с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой.
(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, дСсятичный. ДСсятичный ).

parse_int , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ со строкой ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ JSON int
Π±Ρ‹Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это эквивалСнтно int(num_str) . Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для использования Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ парсСра для Ρ†Π΅Π»Ρ‹Ρ… чисСл JSON
(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ).

ИзмСнСно Π² вСрсии 3.11: По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ parse_int ΠΈΠ· int() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ
цСлочислСнная строка Ρ‡Π΅Ρ€Π΅Π· Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ строку ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°
ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹ конвСрсии, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ°Π·Π°
сСрвисных Π°Ρ‚Π°ΠΊ.

parse_constant , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ…
строки: '-Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ' , 'Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ' , 'NaN' .
Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ссли нСдопустимыС числа JSON
Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ.

ИзмСнСно Π² вСрсии 3.1: parse_constant большС Π½Π΅ вызываСтся для Β«nullΒ», Β«trueΒ», Β«falseΒ».

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ подкласс JSONDecoder , ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cls
ΠΊΠ²Π°Ρ€Π³; ΠΈΠ½Π°Ρ‡Π΅ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ JSONDecoder . Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова
Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ конструктору класса.

Если дСсСриализуСмыС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ JSON,
JSONDecodeError Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ.

ИзмСнСно Π² вСрсии 3.6: ВсС Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова.

ИзмСнСно Π² вСрсии 3.6: fp Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ. Входная ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ
UTF-8, UTF-16 ΠΈΠ»ΠΈ UTF-32.

json.loads( s , * , cls=НСт , object_hook=НСт , parse_float=НСт , parse_int=НСт , Ρ€Π°Π·Π±ΠΎΡ€ _constant=НСт , object_pairs_hook=НСт , **kw )

Π”Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ s (a str , Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ bytearray
экзСмпляр, содСрТащий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ JSON) Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Python, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот
Ρ‚Π°Π±Π»ΠΈΡ†Π° прСобразования.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°() .

Если дСсСриализуСмыС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ JSON,
JSONDecodeError Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ.

ИзмСнСно Π² вСрсии 3.6: s Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ bytes ΠΈΠ»ΠΈ bytearray .
входная ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ UTF-8, UTF-16 ΠΈΠ»ΠΈ UTF-32.

ИзмСнСно Π² вСрсии 3.9: АргумСнт ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова , ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ , Π±Ρ‹Π» ΡƒΠ΄Π°Π»Π΅Π½.

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹

класс json.JSONDecoder( * , object_hook = НСт , parse_float = НСт , parse_int = НСт , parse_constant = НСт , strict=Π˜ΡΡ‚ΠΈΠ½Π° , object_pairs_hook=НСт )

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ JSON.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ прСобразования ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ:

JSON

ΠŸΠΈΡ‚ΠΎΠ½

ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Π΄ΠΈΠΊΡ‚

массив

список

строка

ΡƒΠ»

Π½ΠΎΠΌΠ΅Ρ€ (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ)

Π²Π½ΡƒΡ‚Ρ€.

Π½ΠΎΠΌΠ΅Ρ€ (Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ)

ΠΏΠΎΠΏΠ»Π°Π²ΠΎΠΊ

ΠΏΡ€Π°Π²Π΄Π°

ΠŸΡ€Π°Π²Π΄Π°

Π»ΠΎΠΆΠ½Ρ‹ΠΉ

Π›ΠΎΠΆΡŒ

ноль

НСт

Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ NaN , Infinity ΠΈ -Infinity ΠΊΠ°ΠΊ ΠΈΡ…
ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ значСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой , Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ спСцификации JSON.

object_hook , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ JSON
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ дСкодируСтся, ΠΈ Π΅Π³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ
Π΄ΠΈΠΊΡ‚ . Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для прСдоставлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… дСсСриализаций (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для
ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° подсказок класса JSON-RPC).

object_pairs_hook , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ
ΠžΠ±ΡŠΠ΅ΠΊΡ‚ JSON дСкодируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ упорядочСнного списка ΠΏΠ°Ρ€. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
object_pairs_hook Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто dict . Π­Ρ‚ΠΎΡ‚
функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠ². Если object_hook Ρ‚Π°ΠΊΠΆΠ΅
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, object_pairs_hook ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚.

ИзмСнСно Π² вСрсии 3.1: Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ​​поддСрТка object_pairs_hook .

parse_float , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ со строкой ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ JSON
float для дСкодирования. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это эквивалСнтно float(num_str) .
Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для использования Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ парсСра для JSON с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой.
(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, дСсятичный. ДСсятичный ).

parse_int , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ со строкой ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ JSON int
Π±Ρ‹Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это эквивалСнтно Ρ†Π΅Π»ΠΎΠ΅(число_стр) . Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для использования Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ парсСра для Ρ†Π΅Π»Ρ‹Ρ… чисСл JSON
(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ).

parse_constant , Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ…
строки: '-Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ' , 'Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ' , 'NaN' .
Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ссли нСдопустимыС числа JSON
Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ.

Если strict Ρ€Π°Π²Π½ΠΎ false ( True ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ символы
Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ строк. Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ символы Π² этом контСкстС
Ρ‚Π΅, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ΄Ρ‹ символов находятся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0–31, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ '\t' (Π²ΠΊΠ»Π°Π΄ΠΊΠ°),
'\n' , '\r' ΠΈ '\0' .

Если дСсСриализуСмыС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ JSON,
JSONDecodeError Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ.

ИзмСнСно Π² вСрсии 3.6: ВсС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова.

Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ( с )

Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ прСдставлСниС Python s (экзСмпляр str
содСрТащий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ JSON).

JSONDecodeError Π±ΡƒΠ΄Π΅Ρ‚ поднято, Ссли Π΄Π°Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ JSON Π½Π΅
Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ.

raw_decode( с )

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ JSON ΠΈΠ· s ( str , Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с
Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ JSON) ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 2-ΠΊΠΎΡ€Ρ‚Π΅ΠΆ прСдставлСния Python
ΠΈ индСкс Π² s , Π³Π΄Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ закончился.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для дСкодирования Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° JSON ΠΈΠ· строки, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ
лишниС Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ½Ρ†Π΅.

class json.JSONEncoder( * , skipkeys=False , sure_ascii=True , check_circular=True , allow_nan=True , sort_keys=False , отступ=Π½Π΅Ρ‚ , Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ= НСт , ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ = НСт )

Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ JSON для структур Π΄Π°Π½Π½Ρ‹Ρ… Python.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Ρ‚ΠΈΠΏΡ‹:

ΠŸΠΈΡ‚ΠΎΠ½

JSON

Π΄ΠΈΠΊΡ‚

ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

список, ΠΊΠΎΡ€Ρ‚Π΅ΠΆ

массив

ΡƒΠ»

строка

int, float, int ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΡ‚ float пСрСчислСния

Π½ΠΎΠΌΠ΅Ρ€

ΠŸΡ€Π°Π²Π΄Π°

ΠΏΡ€Π°Π²Π΄Π°

Π›ΠΎΠΆΡŒ

Π»ΠΎΠΆΠ½Ρ‹ΠΉ

НСт

ноль

ИзмСнСно Π² вСрсии 3. 4: Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ​​поддСрТка классов Enum, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ int ΠΈ float.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ это, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ подкласс ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ
ΠΌΠ΅Ρ‚ΠΎΠ΄ default() с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сСриализуСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
для ΠΈΠ»ΠΈ , Ссли Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ супСркласса
(ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ Ошибка Ρ‚ΠΈΠΏΠ° ).

Если skipkeys ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), TypeError Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ, ΠΊΠΎΠ³Π΄Π°
ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ str , int , float
ΠΈΠ»ΠΈ НСт . Если skipkeys истинно, Ρ‚Π°ΠΊΠΈΠ΅ элСмСнты просто ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ.

Если ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ_ascii истинно (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Π²Ρ‹Π²ΠΎΠ΄ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ
ΡΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС входящиС Π½Π΅-ASCII-символы. Если ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ_ascii
false, эти символы Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ.

Если check_circular ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Ρ‚ΠΎ списки, словари ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅
Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ Π½Π° цикличСскиС ссылки Π²ΠΎ врСмя кодирования, Ρ‡Ρ‚ΠΎΠ±Ρ‹
ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ (Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ RecursionError ).
Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ происходит.

Если allow_nan Ρ€Π°Π²Π½ΠΎ true (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Ρ‚ΠΎ NaN , Infinity ΠΈ
-Infinity Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ являСтся JSON
соотвСтствуСт спСцификации, Π½ΠΎ совмСстим с Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ основанных Π½Π° JavaScript
ΠΊΠΎΠ΄Π΅Ρ€Ρ‹ ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ValueError для кодирования
Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠΎΠΏΠ»Π°Π²ΠΊΠΈ.

Если sort_keys Ρ€Π°Π²Π½ΠΎ true (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: False ), Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ словарСй
Π±ΡƒΠ΄Π΅Ρ‚ отсортирован ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ; это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для рСгрСссионных тСстов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ
Π‘Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ JSON ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎ дня Π² дСнь.

Если отступ являСтся Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ числом ΠΈΠ»ΠΈ строкой, Ρ‚ΠΎ элСмСнты массива JSON ΠΈ
Ρ‡Π»Π΅Π½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ красиво Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Ρ‹ с этим ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ отступа. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ отступа
ΠΈΠ· 0, ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ "" Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ строки. НСт (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)
Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ прСдставлСниС. ИспользованиС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ цСлочислСнного отступа
отступов ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ. Если отступ являСтся строкой (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "\t" ),
эта строка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отступа ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня.

ИзмСнСно Π² вСрсии 3.2: Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ строки для с отступом Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ числам.

Если ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ (item_separator, key_separator)
ΠΊΠΎΡ€Ρ‚Π΅ΠΆ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (', ', ': ') , Ссли отступ Ρ€Π°Π²Π΅Π½ НСт ΠΈ
(',', ':') ΠΈΠ½Π°Ρ‡Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ прСдставлСниС JSON,
Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ (',', ':') для устранСния ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².

ИзмСнСно Π² вСрсии 3.4: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ (',', ': ') ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли отступ Π½Π΅ Ρ€Π°Π²Π΅Π½ НСт .

Если ΡƒΠΊΠ°Π·Π°Π½ΠΎ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, которая вызываСтся для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅
ΠΈΠ½Π°Ρ‡Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сСриализован. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ JSON
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠΈΡ‚Π΅ Ошибка Ρ‚ΠΈΠΏΠ° . Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, TypeError
Поднялся.

ИзмСнСно Π² вСрсии 3.6: ВсС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова.

ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ( ΠΈΠ»ΠΈ )

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² подклассС Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» сСриализуСмый
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для o ΠΈΠ»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ
TypeError ).

НапримСр, для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ
ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ() Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

 ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (я, ΠΎ):
   ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ:
       ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ = ΠΈΡ‚Π΅Ρ€ (ΠΎ)
   ΠΊΡ€ΠΎΠΌΠ΅ TypeError:
       ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ
   Π΅Ρ‰Π΅:
       список Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° (повторяСмый)
   # ΠŸΡƒΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ TypeError
   Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ json.JSONEncoder.default (я, ΠΎ)
 
ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ( ΠΈΠ»ΠΈ )

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строковоС прСдставлСниС структуры Π΄Π°Π½Π½Ρ‹Ρ… Python Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON, ΠΈΠ»ΠΈ . Для
ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 >>> json.JSONEncoder().encode({"foo": ["Π±Π°Ρ€", "Π±Π°Π·"]})
'{"foo": ["Π±Π°Ρ€", "Π±Π°Π·"]}'
 
iterencode ( ΠΈΠ»ΠΈ )

Π—Π°ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΠ»ΠΈ , ΠΈ Π²Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ строковоС прСдставлСниС ΠΊΠ°ΠΊ
доступный. НапримСр:

 для Ρ‡Π°Π½ΠΊΠ° Π² json.JSONEncoder().iterencode(bigobject):
    mysocket.write(Ρ‡Π°Π½ΠΊ)
 

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ json.JSONDecodeError ( msg , doc , pos )

Подкласс ValueError со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ:

сообщСниС

НСформатированноС сообщСниС ΠΎΠ± ошибкС.

Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

АнализируСтся Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ JSON.

ΠΏΠΎΠ·.

ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ индСкс Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° , синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ.

Π›ΠΈΠ½Π΅Π½ΠΎ

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΠ·. .

столбСц

Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ†, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ pos .

НовоС Π² вСрсии 3.5.

БоотвСтствиС стандартам ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ

Π€ΠΎΡ€ΠΌΠ°Ρ‚ JSON ΡƒΠΊΠ°Π·Π°Π½ Π² RFC 7159 ΠΈ
ЭКМА-404.
Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описываСтся ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ соотвСтствия этого модуля RFC.
Для простоты подклассы JSONEncoder ΠΈ JSONDecoder ΠΈ
ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ явно упомянутых, Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ.

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ строго Π½Π΅ соотвСтствуСт RFC, рСализуя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅
Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ JavaScript, Π½ΠΎ Π½Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ JSON. Π’ частности:

  • ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΈ выводятся бСсконСчныС ΠΈ числовыС значСния NaN;

  • ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠΌΠ΅Π½Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго
    ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π° имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ RFC Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ синтаксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌ, совмСстимым с RFC, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ тСксты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅
RFC-совмСстимый дСсСриализатор этого модуля тСхничСски соотвСтствуСт RFC Π²
настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов

RFC Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ JSON Π±Ρ‹Π» прСдставлСн с использованиСм UTF-8, UTF-16 ΠΈΠ»ΠΈ
UTF-32, ΠΏΡ€ΠΈ этом UTF-8 рСкомСндуСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для максимальной совмСстимости.

Как Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ, хотя ΠΈ Π½Π΅ трСбуСтся RFC, сСриализатор этого модуля устанавливаСт
sure_ascii=True ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ
строки содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы ASCII.

ΠšΡ€ΠΎΠΌΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° sure_ascii , этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ строго Π²
условия прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python ΠΈ
строк Unicode , ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ адрСсуСт
вопрос ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов.

RFC Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ порядка Π±Π°ΠΉΡ‚ΠΎΠ² (BOM) Π² Π½Π°Ρ‡Π°Π»ΠΎ тСкста JSON,
ΠΈ сСриализатор этого модуля Π½Π΅ добавляСт ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΊ своСму Π²Ρ‹Π²ΠΎΠ΄Ρƒ.
RFC Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Π½ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ дСсСриализаторы JSON ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ
BOM Π½Π° ΠΈΡ… Π²Ρ…ΠΎΠ΄Π΅. ДСсСриализатор этого модуля ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ‚ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠžΡˆΠΈΠ±ΠΊΠ°
ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ спСцификации.

RFC явно Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ строки JSON, содСрТащиС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ².
ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ допустимым символам Unicode (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΏΠ°Ρ€Π½Ρ‹Π΅ символы UTF-16
суррогаты), Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ совмСстимости.
По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ (ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² исходном
str ) ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ для Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ.

БСсконСчныС ΠΈ числовыС значСния NaN

RFC Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ прСдставлСниС бСсконСчных ΠΈΠ»ΠΈ числовых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ NaN.
НСсмотря Π½Π° это, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ ,
-Infinity ΠΈ NaN , ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями числа JSON:

 >>> # Ни ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ JSON
>>> json.dumps(с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой('-inf'))
'-Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ'
>>> json.dumps(float('nan'))
'НаН'
>>> # Π’ΠΎ ΠΆΠ΅ самоС ΠΏΡ€ΠΈ дСсСриализации
>>> json.loads('-Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ')
-ΠΈΠ½Ρ„
>>> json.loads('NaN')
Π½Π°Π½
 

Π’ сСриализаторС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ allow_nan ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния этого
ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’ дСсСриализаторС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ parse_constant ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для
ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠΌΠ΅Π½Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

RFC ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ JSON Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Π½ΠΎ
Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ слСдуСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠΌΠ΅Π½Π° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… JSON. К
ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ; вмСсто этого ΠΎΠ½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ всС, ΠΊΡ€ΠΎΠΌΠ΅
послСдняя ΠΏΠ°Ρ€Π° имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ:

 >>> странный_json = '{"Ρ…": 1, "Ρ…": 2, "Ρ…": 3}'
>>> json.loads(weird_json)
{'Ρ…': 3}
 

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ object_pairs_hook ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния этого повСдСния.

ЗначСния Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ массивами

Бтарая вСрсия JSON, указанная Π² ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΌ RFC 4627 , Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня тСкста JSON Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ JSON, Π»ΠΈΠ±ΠΎ массивом
(Python dict ΠΈΠ»ΠΈ list ) ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ JSON,
логичСскоС, числовоС ΠΈΠ»ΠΈ строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. RFC 7159 снял это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΈ
этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Π» это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½ΠΈ Π²
сСриализатор ΠΈΠ»ΠΈ Π΅Π³ΠΎ дСсСриализатор.

НСсмотря Π½Π° это, для максимальной совмСстимости Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Ρ€ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ
ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡŽ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

НСкоторыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ дСсСриализатора JSON ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ограничСния Π½Π°:

  • Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… тСкстов JSON

  • ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ влоТСнности ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ массивов JSON

  • Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ чисСл JSON

  • содСрТаниС ΠΈ максимальная Π΄Π»ΠΈΠ½Π° строк JSON

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Π½Π°Π»Π°Π³Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, ΠΊΡ€ΠΎΠΌΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…
Π‘Π°ΠΌΠΈ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Python ΠΈΠ»ΠΈ сам ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python.

ΠŸΡ€ΠΈ сСриализации Π² JSON ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ Π»ΡŽΠ±Ρ‹Ρ… Ρ‚Π°ΠΊΠΈΡ… ограничСниях Π² прилоТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚
потрСбляйтС свой JSON. Π’ частности, Π½ΠΎΠΌΠ΅Ρ€Π° JSON часто Π±Ρ‹Π²Π°ΡŽΡ‚
дСсСриализованы Π² числа Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности IEEE 754 ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‚ этому
Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ прСдставлСния ΠΈ ограничСния точности. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ
ΠΏΡ€ΠΈ сСриализации Python int Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ большой Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΈΠ»ΠΈ
ΠΏΡ€ΠΈ сСриализации экзСмпляров «экзотичСских» числовых Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ
дСсятичный. ДСсятичный .

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄: Lib/json/tool.py


ΠœΠΎΠ΄ΡƒΠ»ΡŒ json.tool прСдоставляСт простой интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ
ΠΈ красиво ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ JSON.

Если Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ infile ΠΈ outfile Π½Π΅
ΡƒΠΊΠ°Π·Π°Π½ΠΎ, sys.stdin ΠΈ sys.stdout Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ соотвСтствСнно:

 $ эхо '{"json": "obj"}' | ΠΏΠΈΡ‚ΠΎΠ½-ΠΌ json.tool
{
    "json": "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚"
}
$ эхо '{1.2:3.4}' | ΠΏΠΈΡ‚ΠΎΠ½-ΠΌ json.tool
ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ имя свойства, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ: строка 1 столбСц 2 (char 1)
 

ИзмСнСно Π² вСрсии 3.5: Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС, Ρ‡Ρ‚ΠΎ ΠΈ Π²Π²ΠΎΠ΄. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
--sort-keys опция для сортировки Π²Ρ‹Π²ΠΎΠ΄Π° словарСй
Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ

Π€Π°ΠΉΠ» JSON для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ:

 $ python -m json.tool mp_films. json
[
    {
        "title": "А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅",
        "Π³ΠΎΠ΄": 1971
    },
    {
        "title": "ΠœΠΎΠ½Ρ‚ΠΈ ΠŸΠ°ΠΉΡ‚ΠΎΠ½ ΠΈ Бвятой Π“Ρ€Π°Π°Π»ΡŒ",
        "Π³ΠΎΠ΄": 1975
    }
]
 

Если infile Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· sys.stdin .

Π°ΡƒΡ‚Ρ„Π°ΠΉΠ»

Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ infile Π² Π΄Π°Π½Π½Ρ‹ΠΉ outfile . Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ это
Π½Π° sys.stdout .

β€”sort-ΠΊΠ»ΡŽΡ‡ΠΈ

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π° словарСй Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

НовоС Π² вСрсии 3.5.

β€”no-ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ-ascii

ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ экранированиС символов, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ ASCII, см. json.dumps() для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

НовоС Π² вСрсии 3.9.

β€”json-Π»ΠΈΠ½ΠΈΠΈ

ΠΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Π²Π²ΠΎΠ΄Π° ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON.

НовоС Π² вСрсии 3.8.

β€”indent, β€”tab, β€”no-indent, β€”compact

Π’Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ для управлСния ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ.

НовоС Π² вСрсии 3.9.

-Ρ‡, β€”help

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ справочноС сообщСниС.

Бноски

1

Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π² исправлСниях для RFC 7159,
JSON допускаСт использованиС Π±ΡƒΠΊΠ² U+2028 (LINE SEPARATOR) ΠΈ
U+2029(PARAGRAPH SEPARATOR) символов Π² строках, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ JavaScript
(начиная с ECMAScript Edition 5.1) Π½Π΅Ρ‚.

β€” Начало Elm

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GETΒ» ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ строку с HTTP-сСрвСра. Π’ настоящСС врСмя Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ сСрвСры Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° нашСго сСрвСра со строкового Π½Π° JSON ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Elm для прСобразования этого JSON Π² значСния Elm.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ локального сСрвСра JSON

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ HTTP-сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создали Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ JSON. ВсС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ наши Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ JSON вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ строки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

.

Но Π΅ΡΡ‚ΡŒ способ Π»ΡƒΡ‡ΡˆΠ΅. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСрвСр, настроСнный для обслуТивания JSON вмСсто статичСских Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°ΠΊΠ΅Ρ‚ NPM с ΠΈΠΌΠ΅Π½Π΅ΠΌ json-server. Π˜Π΄ΠΈΡ‚Π΅ Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ установитС Π΅Π³ΠΎ глобально, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -g , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ· любого мСста Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅.

 $ npm install json-server -g 

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создайтС Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ old-school.json Π²Π½ΡƒΡ‚Ρ€ΠΈ begin-elm/server .

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ JSON Π² Ρ„Π°ΠΉΠ» old-school.json .

 {
    "ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°": ["ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†", "Π’Π°Π½ΠΊ", "Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°", "Π‘Ρ‹Ρ€"]
} 

Π”Π°Π²Π°ΠΉΡ‚Π΅ запустим сСрвСр JSON, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° begin-elm Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ созданный Π½Π°ΠΌΠΈ HTTP-сСрвСр Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GETΒ», Ссли ΠΎΠ½ всС Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½Π°ΠΆΠ°Π² 9.}/ ΠΏΡ€ΠΈΠ²Π΅Ρ‚!
Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сСрвСра/old-school.json
Π‘Π΄Π΅Π»Π°Π½Π½Ρ‹ΠΉ
РСсурсы
http://localhost:5019/псСвдонимы
Π”ΠΎΠΌ
http://Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ: 5019
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ s + enter Π² любоС врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ снимок Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….
Π‘ΠΌΠΎΡ‚Ρ€ΡŽβ€¦

Нравится http-server , json-server Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ нас ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹Π΅. Π’ нашСм случаС это server/old-school.json . ΠžΠΏΡ†ΠΈΡ --watch ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сСрвСру Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° Π»ΡŽΠ±Ρ‹ΠΌΠΈ измСнСниями, внСсСнными Π² old-school.json . Если ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ эту ΠΎΠΏΡ†ΠΈΡŽ, Π½Π°ΠΌ придСтся ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвСр ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° этот Ρ„Π°ΠΉΠ» измСняСтся. 9ΠžΠΏΡ†ΠΈΡ 0018 -p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΡ€Ρ‚. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ€Ρ‚ ( 5019 ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° с сСрвСром, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создали Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GETΒ», Ссли ΠΎΠ½ всС Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ адрСсу http://localhost:5019/nicknames Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ список псСвдонимов, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, Π·Π½Π°Ρ‡ΠΈΡ‚, сСрвСр Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

 [
  "ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†",
  "Π’Π°Π½ΠΊ",
  "Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°",
  "Π‘Ρ‹Ρ€"
] 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ URL-адрСс для получСния псСвдонимов измСнился ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» Ρ€Π°Π½ΡŒΡˆΠ΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GETΒ»:

  • Новый URL-адрСс с json-сСрвСром : http://localhost:5019/псСвдонимы
  • Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ URL-адрСс с http-сСрвСром : http://localhost:5016/old-school. txt

Π‘ΠΎ старым URL-адрСсом ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ имя Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ обслуТивал содСрТимоС статичСского Ρ„Π°ΠΉΠ»Π°. Новый URL ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ рСсурс ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ всС содСрТимоС Ρ„Π°ΠΉΠ»Π°, json-server позволяСт Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ рСсурсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто способом Π½Π°Π·Π²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π”ΠΎΠ±Π°Π²ΠΈΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ JSON Π² old-school.json , присваиваСм имя Π½ΠΈΠΊΠΎΠ² рСсурсу ["ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†", "Π’Π°Π½ΠΊ", "Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°", "Π‘Ρ‹Ρ€"] .

 {
    "ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°": ["ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†", "Π’Π°Π½ΠΊ", "Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°", "Π‘Ρ‹Ρ€"]
} 

РСсурсы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС, Ρ‡Π΅ΠΌ просто список строк. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· страницы Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ json-server :

 {
  "сообщСния": [
    {
      "ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€": 1,
      "Π½Π°Π·Π²Π°Π½ΠΈΠ΅": "json-сСрвСр",
      "Π°Π²Ρ‚ΠΎΡ€": "Ρ‚ΠΈΠΏΠΈΠΊΠΎΠ΄"
    },
    {
      "ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€": 2,
      "title": "http-сСрвСр",
      "Π°Π²Ρ‚ΠΎΡ€": "индСксноль"
    }
  ],
  "ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ": [
    {
      "ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€": 1,
      "Ρ‚Π΅Π»ΠΎ": "ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ",
      "Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сообщСния": 1
    }
  ],
  "ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ": {
    "имя": "Ρ‚ΠΈΠΏΠΈΠΊΠΎΠ΄"
  }
} 

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ JSON опрСдСляСт Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… рСсурса: сообщСний , ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ . РСсурс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ, Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ. постов ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠ°ΠΌΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ прСдставляСт собой Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ рСсурс ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ мСсто, ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ.

Π­Ρ‚Π° концСпция станСт понятнСС, Ссли ΠΌΡ‹ попытаСмся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эти рСсурсы ΠΈΠ· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π˜Π΄ΠΈΡ‚Π΅ Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ JSON Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ 9.0018 db.json Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ begin-elm/server . db β€” это сокращСниС ΠΎΡ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π΅ΠΏΠ΅Ρ€ΡŒ остановитС сСрвСр JSON, Π½Π°ΠΆΠ°Π² Ctrl + c , ΠΈ пСрСзапуститС Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вмСсто Π½Π΅Π³ΠΎ использовался Ρ„Π°ΠΉΠ» db.json .

 $ json-server --watch server/db.json -p 5019 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… пСрСчислСны всС доступныС рСсурсы.

 РСсурсы
http://Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ: 5019/сообщСний
http://Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ:5019/ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ
http://Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ: 5019/profile 

json-server фактичСски создал для нас REST API. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ рСсурс сообщСний , Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ² http://localhost:5019/posts Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π’Π°Ρˆ Π²Ρ‹Π²ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

 [
  {
    "ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€": 1,
    "Π½Π°Π·Π²Π°Π½ΠΈΠ΅": "json-сСрвСр",
    "Π°Π²Ρ‚ΠΎΡ€": "Ρ‚ΠΈΠΏΠΈΠΊΠΎΠ΄"
  },
  {
    "ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€": 2,
    "title": "http-сСрвСр",
    "Π°Π²Ρ‚ΠΎΡ€": "индСксноль"
  }
] 

posts Ρ‚Π°ΠΊΠΆΠ΅ являСтся рСсурсом, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ содСрТит Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя Π΄Ρ€ΡƒΠ³ΠΈΠ΅ рСсурсы. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ рСсурс Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ , ΡƒΠΊΠ°Π·Π°Π² id . Если Π²Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ URL-адрСс http://localhost:5019/posts/1 Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ сообщСниС.

 {
  "ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€": 1,
  "Π½Π°Π·Π²Π°Π½ΠΈΠ΅": "json-сСрвСр",
  "Π°Π²Ρ‚ΠΎΡ€": "Ρ‚ΠΈΠΏΠΈΠΊΠΎΠ΄"
} 

НадСюсь, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ json-server . Нам Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ всС это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ JSON с нашСго сСрвСра. Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС эти знания пригодятся, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ рСсурсы Π² Π³Π»Π°Π²Π΅ 7, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ POST , PATCH ΠΈ DELETE ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π΅ HTTP.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ JSON ΠΈΠ· прилоТСния Elm

Π”Π°Π²Π°ΠΉΡ‚Π΅ вСрнСмся ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Elm, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ написали Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GETΒ». Π’ Ρ„Π°ΠΉΠ»Π΅ HttpExamples.elm , располоТСнном Π²Π½ΡƒΡ‚Ρ€ΠΈ begin-elm/src , ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ строку ΠΈ использовали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ String.split для извлСчСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… псСвдонимов ΠΈΠ· этой строки.

ОбновлСниС

: Msg -> Model -> (Model, Cmd Msg)
ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ модСль сообщСния =
    Π΄Π΅Π»ΠΎ сообщСниС ΠΈΠ·
        ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒHttpRequest ->
            (модСль, getNicknames)
        DataReceived (Ok Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹Str) ->
            ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ
                ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° =
                    String.split "," ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°Str
            Π²
            ( { модСль | ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° = ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° }, Cmd.none )
        .
        . 

Нам придСтся ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ этой Π»ΠΎΠ³ΠΈΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ псСвдонимы Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ сСрвСр JSON, Π½Π°ΠΆΠ°Π² Ctrl + c , Ссли ΠΎΠ½ Π·Π°ΠΏΡƒΡ‰Π΅Π½, ΠΈ пСрСзапуститС Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» old-school. json .

 $ json-server --watch server/old-school.json -p 5019 

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² HttpExamples.elm , это URL-адрСс.

 URL-адрСс: строка
URL =
    "http://localhost:5019/nicknames" 

ΠŸΡ€ΠΎΡ†Π΅ΡΡ получСния JSON с сСрвСра Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ отличаСтся ΠΎΡ‚ получСния строки. Π₯отя ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ JSON, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ…, отправляСмый сСрвСром, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ 9.0062 нСобработанная строка . Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΊΠ°ΠΊ клиСнтскоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠ·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚, Ссли ΠΎΠ½ всСгда ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π²ΠΈΠ΄Π΅ строки? Он Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ для извлСчСния псСвдонимов ΠΈΠ· строки, Π° Ρ‚Π°ΠΊΠΆΠ΅ JSON.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, сСрвСр ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π²Π΅Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Content-Type . Для JSON сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ application/json Π² качСствС значСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Content-Type . ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для строки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ тСкстовый/ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ .

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ JSON

Elm прСдоставляСт ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ elm/json , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для кодирования ΠΈ дСкодирования Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ JSON. ΠœΡ‹ установили этот ΠΏΠ°ΠΊΠ΅Ρ‚ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Type System, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ.

 $ elm install elm/json 

Если ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ установлСн, запуститС ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° begin-elm Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. НС запускайтС Π΅Π³ΠΎ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠΊΠ½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, Π³Π΄Π΅ ΠΌΡ‹ запускали json-сСрвСр Ρ€Π°Π½Π΅Π΅. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ. Когда elm install запросит вашС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ y . ПослС этого ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Json.Decode Π² HttpExamples.elm .

 ΠΌΠΎΠ΄ΡƒΠ»ΡŒ HttpExamples выставлСниС (основной)
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Json.Decode, Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ (Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ошибка (..), decodeString, список, строка)
.
. 

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ JSON Π² значСния Elm. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π°Π΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ . функция Π² HttpExamples.elm .

 псСвдонимовDecoder : Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ (строка списка)
ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ =
    list string 

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ list string создаСт Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ массив JSON Π² список строк Elm. Π—Π²ΡƒΡ‡ΠΈΡ‚ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ? Π”Π°Π²Π°ΠΉΡ‚Π΅ поэкспСримСнтируСм с этим Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ. ЗапуститС elm repl ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° begin-elm Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄.

 > ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Json.Decode, Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ (..)
> список
<функция> : Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ a -> Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ (список a) 

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Π²Π΅Π»ΠΈ всСго list . Π’Ρ‹Π²ΠΎΠ΄ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ список β€” это функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Π²Π΅Π΄Π΅ΠΌ строку .

 > строка
 : Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠœΡ‹ смогли ввСсти список ΠΈ строку Π² repl Π±Π΅Π· прСфикса ΠΈΠΌΠ΅Π½ΠΈ модуля, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ выставили всС ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ Json. Decode .

Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ строк

string β€” это Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ строку JSON Π² строку Elm. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 > строка decodeString "\"Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°\""
Π₯ΠΎΡ€ΠΎΡˆΠΎ "Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°": Π‘Ρ‚Ρ€ΠΎΠΊΠ° ошибки Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° 

ΠœΡ‹ использовали Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ "\"Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°\"" содСрТит строку JSON Π² Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ строкС. 9Π‘Ρ‚Ρ€ΠΎΠΊΠ° 0018 сама ΠΏΠΎ сСбС Π½Π΅ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ JSON. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ для Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ. Ѐункция decodeString выполняСт фактичСскоС Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΡƒΡŽ строку Π² JSON, Π° Π·Π°Ρ‚Π΅ΠΌ примСняСт Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ строки для прСобразования этого JSON Π² строку Elm.

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ поясняСтся сигнатура Ρ‚ΠΈΠΏΠ° decodeString .

Json.Decode.Error

ΠŸΡ€ΠΈ сбоС дСкодирования decodeString Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Error . Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 > строка decodeString "42"
Err (ΠžΡ‚ΠΊΠ°Π· ("ОТиданиС STRING") <Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅>)
    : Result Error String 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π₯отя ΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ 42 Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, это Π½Π΅ считаСтся строкой JSON. Π§Ρ‚ΠΎΠ±Ρ‹ это Π±Ρ‹Π»Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ строка JSON, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π½Π°Π±ΠΎΡ€ Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: "\"42\"" .

Π’ΠΈΠΏ Ошибка ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠœΠΎΠ΄ΡƒΠ»ΡŒ Json.Decode ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

 Вип Ошибка
    = Ошибка строки поля
    | Ошибка индСкса
    | OneOf (ошибка списка)
    | Ошибка Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 

Π­Ρ‚ΠΎ рСкурсивный Ρ‚ΠΈΠΏ. Π Π°Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «БистСма Ρ‚ΠΈΠΏΠΎΠ²Β» ΠΌΡ‹ создали собствСнный рСкурсивный Ρ‚ΠΈΠΏ:

.

 Π²Π²Π΅Π΄ΠΈΡ‚Π΅ MyList a
    = ΠŸΡƒΡΡ‚ΠΎ
    | Node a (MyList a) 

Π’Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ сходство? Оба Ρ‚ΠΈΠΏΠ° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ конструктор Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ являСтся рСкурсивным. Π‘Π΅Π· этих конструкторов Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ бСсконСчноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 Π£Π·Π΅Π» 16 (Π£Π·Π΅Π» 5 (Π£Π·Π΅Π» 31 (Π£Π·Π΅Π» 9) (Π£Π·Π΅Π» 18 (Π£Π·Π΅Π» 7 (Π£Π·Π΅Π» 26 (...))))))) 

Но ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚ΠΈΠΏ Ошибка Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ слоТным? ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просто строкой? На самом Π΄Π΅Π»Π΅ Π΄ΠΎ Elm 0. 19 это Π±Ρ‹Π»Π° просто строка. Π‘ΠΎΠ·Π΄Π°Π² Π±ΠΎΠ»Π΅Π΅ слоТный Ρ‚ΠΈΠΏ, Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Π° elm/json Π΄Π°Π»ΠΈ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, возникшСй Π² процСссС дСкодирования. НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ, Π²Ρ‹Π·Π²Π°Π²ΡˆΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, красным Ρ†Π²Π΅Ρ‚ΠΎΠΌ.

ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² подробности Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ это ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ послС прочтСния Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² Β«Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ JSON β€” Ρ‡Π°ΡΡ‚ΡŒ 1Β» ΠΈ Β«Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ JSON β€” Ρ‡Π°ΡΡ‚ΡŒ 2Β».

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹

Elm прСдоставляСт Ρ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° для прСобразования ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² JSON Π² значСния Elm: int , float ΠΈ bool . Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΈΡ… Π² дСйствии:

 > decodeString Ρ†Π΅Π»ΠΎΠ΅ число "9"
Ok 9: Ошибка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Int
> decodeString int "2.5"
Err (Ошибка ("ОТиданиС INT") <Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅>)
    : Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ошибка Π¦Π΅Π».
> decodeString с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой "2.5"
Π₯ΠΎΡ€ΠΎΡˆΠΎ 2.5: Ошибка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой
> decodeString bool "истина"
Ok True : Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ошибка Bool
> decodeString логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "false"
OK False : Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ошибка Bool
> decodeString bool "87"
Err (Ошибка ("ОТиданиС BOOL") <Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅>)
    : Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ошибка Bool 
Π”Π΅ΡˆΠΈΡ„Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… комплСксов

JSON ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…:

  • string β€” Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° строку Elm.

  • число β€” Число Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌ числом ΠΈΠ»ΠΈ вСщСствСнным числом.

  • логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ true , Π»ΠΈΠ±ΠΎ false .

  • array β€” Массив ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния JSON, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сами массивы.

  • ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” ΠžΠ±ΡŠΠ΅ΠΊΡ‚ состоит ΠΈΠ· ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

  • null β€” null ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обозначСния отсутствия значСния.

ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки, числа ΠΈ логичСскиС значСния. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹ Π² качСствС ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ². НачнСм с массива JSON.

Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ списка

Π Π°Π½Π΅Π΅ ΠΌΡ‹ создали Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° массива строк JSON Π² список строк Elm.

 псСвдонимовDecoder : Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ (строка списка)
ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ =
    list string 

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив псСвдонимов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ list string ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

 > псСвдонимJson = "[\"ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†\", \"Π’Π°Π½ΠΊ\", \"Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°\", \"Π‘Ρ‹Ρ€\"]"
"[\"ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†\", \"Π’Π°Π½ΠΊ\", \"Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°\", \"Π‘Ρ‹Ρ€\"]" : String
> decodeString (строка списка) NickJson
Π₯ΠΎΡ€ΠΎΡˆΠΎ [Β«ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†Β», Β«Π’Π°Π½ΠΊΒ», Β«Π¨Π°ΠΏΠΎΡ‡ΠΊΠ°Β», Β«Π‘Ρ‹Ρ€Β»]
    : Ошибка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (строка списка) 

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив Ρ†Π΅Π»Ρ‹Ρ… чисСл JSON (ΠΈΠ»ΠΈ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

 > decodeString (список Ρ†Π΅Π»Ρ‹Ρ… чисСл) "[1, 2, 3]"
Ok [1,2,3]: ошибка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (List Int)
> decodeString (список с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой) "[1. 5, 2.5]"
Π₯ΠΎΡ€ΠΎΡˆΠΎ [1.5,2.5]: Ошибка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (список с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой) 

список сам ΠΏΠΎ сСбС Π½Π΅ являСтся Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠΌ. Π­Ρ‚ΠΎ функция, которая Π±Π΅Ρ€Π΅Ρ‚ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΈ создаСт Π±ΠΎΠ»Π΅Π΅ слоТный Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит Π΅Π³ΠΎ подпись Ρ‚ΠΈΠΏΠ°:

 список : Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ a -> Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ (список a) 

Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JSON, содСрТащий массив массивов, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ список Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠ² нСсколько Ρ€Π°Π·, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 > decodeString (список (список int)) "[[1, 2], [4, 5]]"
Π₯ΠΎΡ€ΠΎΡˆΠΎ [[1,2],[4,5]]
    : Result Error (List (List Int)) 

Π“Π»ΡƒΠ±ΠΈΠ½Π° влоТСнности Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Elm Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС элСмСнты Π² спискС List Π±Ρ‹Π»ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив JSON с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.

 > decodeString (список (список int)) "[[1, 2], [3.5, 4.5]]"
Err (ИндСкс 1 (ИндСкс 0 (Π‘Π±ΠΎΠΉ ("ОТиданиС INT") <Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅>)))
    : Ошибка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (Бписок (Бписок Ρ†Π΅Π»Ρ‹Ρ…)) 
Π—Π°ΠΌΠ΅Π½Π°

String. split Π½Π° Π½ΠΈΠΊΠΎΠ² Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ поняли, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹ list ΠΈ string , Π΄Π°Π²Π°ΠΉΡ‚Π΅ вСрнСмся ΠΊ HttpExamples.elm ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ String.split Π½Π° псСвдонимовDecoder Π² DataReceived ( Ок Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹Str) -> Π²Π΅Ρ‚ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ .

ОбновлСниС

: Msg -> Model -> (Model, Cmd Msg)
ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ модСль сообщСния =
    Π΄Π΅Π»ΠΎ сообщСниС ΠΈΠ·
        .
        .
        DataReceived (ΠΎΠΊΠ΅ΠΉ Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹Json) ->
            case decodeString псСвдонимыДСкодСрныС Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹Json of
                Ок Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹ ->
                    ( { модСль | ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° = ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° }, Cmd.none )
                Ошибка ошибки ->
                    ( {модСль | errorMessage = ошибка handleJsonError }
                    , Cmd.none
                    )
        .
        . 

ΠœΡ‹ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ с Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΎΠ²Str Π½Π° Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΎΠ²Json ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ let Π½Π° case . Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ String.split , decodeString Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ . Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ использовали Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ case для извлСчСния Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΎΠ² ΠΈΠ· Ok . Если Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ удаСтся, для извлСчСния сообщСния ΠΎΠ± ошибкС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция handleJsonError . Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½ΠΈΠΆΠ΅ update .

 handleJsonError : Json.Decode.Error -> Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, строка
ошибка handleJsonError =
    случайная ошибка
        Ошибка errorMessage _ ->
            ΠŸΡ€ΠΎΡΡ‚ΠΎ сообщСниС ΠΎΠ± ошибкС
        _ ->
            ΠŸΡ€ΠΎΡΡ‚ΠΎ «Ошибка: Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ JSONΒ» 

Нас интСрСсуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ конструктор Π΄Π°Π½Π½Ρ‹Ρ… Failure , ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Π½Π΅ΠΌ находится сообщСниС ΠΎΠ± ошибкС. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Failure β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ JSON, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π΅ сбой. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π½Π° 9.0018 _ .

ЗапуститС elm Reactor ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° begin-elm Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ этому URL-адрСсу Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅: http://localhost:8000/src/HttpExamples. elm . НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с сСрвСра , ΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ список псСвдонимов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GET.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ http-server , json-server автоматичСски Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ совмСстноС использованиС рСсурсов ΠΌΠ΅ΠΆΠ΄Ρƒ источниками (CORS). Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π’ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠΌ рСсурсС отсутствуСт Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Β«Access-Control-Allow-OriginΒ». Ошибка ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΎΠ².

Π—Π°ΠΌΠ΅Π½Π°

expectString Π½Π° expectJson

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ псСвдонимы JSON.

Π¨Π°Π³ 1: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Http.get . Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎΠΉ URL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ сообщитС срСдС выполнСния Elm, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ строкой.

 getNicknames : Cmd Msg
ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΠ½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹ =
    http.ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ
        { URL-адрСс = URL-адрСс
        , ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ = Http. expectString DataReceived
        } 

Π¨Π°Π³ 2: Π‘Ρ€Π΅Π΄Π° выполнСния запускаСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ.

Π¨Π°Π³ 3: Π‘Ρ€Π΅Π΄Π° выполнСния отправляСт сообщСниС DataReceived Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ update .

  • Π¨Π°Π³ 3.1: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ JSON Π² качСствС ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ссли запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ псСвдонимов Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.
  • Π¨Π°Π³ 3.2: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΈΠΏΠ° Http.Error Π² качСствС ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ссли запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ псСвдонимов Π½Π΅ удаСтся.

Π¨Π°Π³ 4: Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JSON Π²Π½ΡƒΡ‚Ρ€ΠΈ DataReceived (Ok NicksJson) -> Π²Π΅Ρ‚Π²ΡŒ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ .

  • Π¨Π°Π³ 4.1: Если Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ свойство псСвдонимов Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ.
  • Π¨Π°Π³ 4.2: ΠŸΡ€ΠΈ сбоС дСкодирования ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ свойство errorMessage Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ этот процСсс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Http. expectJson вмСсто Http.expectString Π² getNicknames . Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ процСсс:

Π¨Π°Π³ 1: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Http.get . Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎΠΉ URL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ сообщитС срСдС выполнСния Elm, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.

 getNicknames : Cmd Msg
ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΠ½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹ =
    http.ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ
        { URL-адрСс = URL-адрСс
        , expect = Http.expectJson DataReceived Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΎΠ²Decoder
        } 

Π¨Π°Π³ 2: Π‘Ρ€Π΅Π΄Π° выполнСния запускаСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ.

Π¨Π°Π³ 3: Π‘Ρ€Π΅Π΄Π° выполнСния отправляСт 9Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ 0018 DataReceived для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ обновлСния .

  • Π¨Π°Π³ 3.1: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ псСвдонимы Π² качСствС ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ссли запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ JSON ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

  • Π¨Π°Π³ 3.2: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΈΠΏΠ° Http.Error Π² качСствС ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² случаС сбоя запроса Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ JSON ΠΈΠ»ΠΈ дСкодирования.

Нам Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ шаг 4 Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Http.expectJson . Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ JSON происходит Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Π΅ΠΌ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Http.expectString ΠΈ Http.expectJson .

Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Http.expectString Π½Π° Http.expectJson Π² getNicknames , ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, Ссли Π²Ρ‹ Π΅Ρ‰Π΅ этого Π½Π΅ сдСлали. Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Π΅Ρ‚ΠΊΡƒ DataReceived (Ok NicknamesJson) -> Π² update .

ОбновлСниС

: Msg -> Model -> (Model, Cmd Msg)
ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ модСль сообщСния =
    Π΄Π΅Π»ΠΎ сообщСниС ΠΈΠ·
        .
        .
        DataReceived (ΠΎΠΊΠ΅ΠΉ Π½ΠΈΠΊΠΈ) ->
            ( { модСль | ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° = ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° }, Cmd.none )
        ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… (ошибка httpError) ->
            ... 

Http.expectJson Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ упростил эту Π²Π΅Ρ‚ΠΊΡƒ. Нам большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JSON. Π­Ρ‚ΠΎ происходит автоматичСски Π·Π° кулисами. Если Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ список Elm, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ нСпосрСдствСнно Π² ΠΏΠΎΠ»Π΅ псСвдонимов Π² нашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сообщСния DataReceived , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ List String вмСсто просто String .

 Ρ‚ΠΈΠΏ Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅
    = ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒHttpRequest
    | DataReceived (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Http.Error (строка списка)) 

Нам Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Π΅Ρ‚ΠΊΡƒ DataReceived (Err httpError) -> Π² update . Π’ случаС сбоя дСкодирования Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° ошибка Http.BadBody , ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π² buildErrorMessage . НаконСц, ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ handleJsonError . Нам это большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ страницу ΠΏΠΎ адрСсу http://localhost:8000/src/HttpExamples.elm ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с сСрвСра . Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ список Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΎΠ².

РСзюмС

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, настроСнный для обслуТивания JSON. ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ JSON с этого сСрвСра ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π² значСния Elm с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π°. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ процСсс извлСчСния ΠΈ дСкодирования JSON с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Http.expectJson вмСсто Http.expectString . На ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ срСдой выполнСния Elm ΠΈ нашим ΠΊΠΎΠ΄ΠΎΠΌ Π½Π΅ сильно измСнилось ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ Β«Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GETΒ».

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный JSON. Π’ΠΎΡ‚ вСсь ΠΊΠΎΠ΄ ΠΈΠ· HttpExamples.elm Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚:

 ΠΌΠΎΠ΄ΡƒΠ»ΡŒ HttpExamples выставлСниС (основной)
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ HTML-Ρ€Π°Π·ΠΎΠ±Π»Π°Ρ‡Π΅Π½ΠΈΠ΅ (..)
ΠΈΠΌΠΏΠΎΡ€Ρ‚ Html.Events (onClick)
ΠΈΠΌΠΏΠΎΡ€Ρ‚ HTTP
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Json.Decode, Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ (Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ошибка (. .), decodeString, список, строка)
Π²Π²Π΅Π΄ΠΈΡ‚Π΅ псСвдоним МодСль =
{ ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° : строка списка
, errorMessage : Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π‘Ρ‚Ρ€ΠΎΠΊΠ°
}
прСдставлСниС: МодСль -> Html Msg
модСль просмотра =
Ρ€Π°Π·Π΄Π΅Π» []
[ΠΊΠ½ΠΎΠΏΠΊΠ° [ onClick SendHttpRequest ]
[ тСкст "ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с сСрвСра" ]
, модСль viewNicknamesOrError
]
viewNicknamesOrError: МодСль -> Html Msg
модСль viewNicknamesOrError =
case model.errorMessage of
ΠŸΡ€ΠΎΡΡ‚ΠΎ сообщСниС ->
сообщСниС ΠΎΠ± ошибкС просмотра
НичСго ->
viewNicknames model.nicknames
viewError: строка -> Html-сообщСниС
viewError errorMessage =
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ
ΠΎΡˆΠΈΠ±ΠΊΠ°Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ =
"Π’ настоящСС врСмя Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ псСвдонимы."
Π²
Ρ€Π°Π·Π΄Π΅Π» []
[ h4 [] [тСкстовая ΠΎΡˆΠΈΠ±ΠΊΠ°Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ]
, тСкст ("Ошибка: " ++ errorMessage)
]
viewNicknames : Π‘Ρ‚Ρ€ΠΎΠΊΠ° списка -> Html Msg
Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹ viewNicknames =
Ρ€Π°Π·Π΄Π΅Π» []
[ h4 [] [тСкст "Π“Π»Π°Π²Π½Ρ‹Π΅ Π³Π΅Ρ€ΠΎΠΈ старой ΡˆΠΊΠΎΠ»Ρ‹" ]
, ul [] (List. map viewNickname Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹)
]
viewNickname : String -> Html Msg
Π½ΠΈΠΊΠ½Π΅ΠΉΠΌ viewNickname =
li [] [тСкстовоС имя]
Π²Π²Π΅Π΄ΠΈΡ‚Π΅ сообщСниС
= ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒHttpRequest
| DataReceived (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Http.Error (строка списка))
URL-адрСс: строка
URL =
"http://Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ:5019/ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°"
getNicknames : Cmd Msg
ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΠ½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹ =
http.ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ
{ URL-адрСс = URL-адрСс
, expect = Http.expectJson DataReceived Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΎΠ²Decoder
}
Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ : Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ (строка списка)
ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°Π”Π΅ΠΊΠΎΠ΄Π΅Ρ€ =
строка списка
ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: Msg -> Model -> (Model, Cmd Msg)
ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ модСль сообщСния =
Π΄Π΅Π»ΠΎ сообщСниС ΠΈΠ·
ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒHttpRequest ->
(модСль, getNicknames)
DataReceived (ΠΎΠΊΠ΅ΠΉ Π½ΠΈΠΊΠΈ) ->
( { модСль | ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° = ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° }, Cmd.none )
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… (ошибка httpError) ->
( { модСль
| errorMessage = ΠŸΡ€ΠΎΡΡ‚ΠΎ (buildErrorMessage httpError)
}
, Cmd.none
)
buildErrorMessage : Http.