JSON ගොනුවක් ලස්සනට මුද්‍රණය කරන්නේ කෙසේද?


1119

මා සතුව JSON ගොනුවක් ඇති අතර එය අවුල් සහගතය. පයිතන් හි මෙය කිරීමට ඇති පහසුම ක්‍රමය කුමක්ද?

මම දන්නවා PrettyPrint ගොනුවක් විය හැකි යැයි සිතන "වස්තුවක්" ගන්නා නමුත් ගොනුවක් ඇතුල් කරන්නේ කෙසේදැයි මම නොදනිමි. ගොනු නාමය භාවිතා කිරීම පමණක් ක්‍රියා නොකරයි.


9
JSON භාවිතා කර විග්‍රහ කිරීමට උත්සාහ කරන්න json.loads(). හෝ සඳහා පයිතන් ප්‍රලේඛනයේ ලස්සන මුද්‍රණ අංශය වෙත යන්න . json
බ්ලෙන්ඩර්


1
Le බ්ලෙන්ඩර් ඔබ පිළිතුරක් පළ කළහොත් මම ඔබට ගෞරවය දෙන්නෙමි ... මෙය අනුපිටපතක් ලෙස වසා දැමිය හැකිය, මන්ද විසඳුම එක හා සමාන වන නමුත් ප්‍රශ්නය වෙනස් ය, එබැවින් සමහර විට එසේ නොවේ.
කොලීන්

18
<your_file.js python -mjson.tool@ ed ගේ සබැඳියේ මෙන් නොවන්නේ ඇයි ?
jfs

11
විධාන රේඛාවෙන් ලස්සන ලෙස මුද්‍රණය කිරීම පයිතන් වෙතින් ක්‍රමලේඛයෙන් මුද්‍රණය කිරීම හා සමාන නොවන නිසා එය අනුපිටපතක් යැයි මම නොසිතමි. නැවත විවෘත කිරීමට ඡන්දය දීම.
vitaut

Answers:


1752

මෙම jsonමොඩියුලය දැනටමත් සමහර මූලික ලස්සන මුද්රණය ක්රියාත්මක indent: විශේෂයෙන් නියම ආකාරය බොහෝ හිස් තැන් මගින් එබුම කිරීමට පරාමිතිය

>>> import json
>>>
>>> your_json = '["foo", {"bar":["baz", null, 1.0, 2]}]'
>>> parsed = json.loads(your_json)
>>> print(json.dumps(parsed, indent=4, sort_keys=True))
[
    "foo", 
    {
        "bar": [
            "baz", 
            null, 
            1.0, 
            2
        ]
    }
]

ගොනුවක් විග්‍රහ කිරීමට, භාවිතා කරන්න json.load():

with open('filename.txt', 'r') as handle:
    parsed = json.load(handle)

154
සරල මුද්‍රණය සඳහා මෙය පැහැදිලි print json.dumps(your_json_string, indent=4)
විග්‍රහයකින්

11
ඉන්ඩෙන්ට් නොමැතිව, ඔබට එක් කැත පෙළක් ලැබෙනු ඇත, ඒ නිසා මම මෙහි ආවෙමි.
krs013

2
var str = JSON.stringify(obj, null, 4);මෙහි සාකච්ඡා කර ඇති පරිදි මෙය ජාවාස්ක්‍රිප්ට් වලට සමානය. Stackoverflow.com/questions/4810841/…
ක්‍රිස්ටෝෆ් රූසි

1
ඔබ මේ සඳහා සේවය කරන්නේ ෆ්ලැස්ක් හෝ ජැන්ගෝ වැනි වෙබ් සේවාදායක මාර්ගයකට නම්, ඔබට පැකට්ටුව එතීමට අවශ්‍ය වන <pre>අතර </pre>එසේ නොවුවහොත් බ්‍රව්සරයේ විදැහුම් කරන විට සුදු අවකාශය ඉවත් වේ.
phyatt

7
EtPeterino මට මුලින් json string විග්‍රහ කිරීමට සිදු විය: print(json.dumps(json.loads(your_json_string), indent=2))එසේ නොවුවහොත් එය මට පැන ගිය නූලක්
පෙන්වීය

326

විධාන රේඛාවෙන් ඔබට මෙය කළ හැකිය:

python3 -m json.tool some.json

(ප්‍රශ්නයට විවරණ වල දැනටමත් සඳහන් කර ඇති පරිදි, පයිතන් 3 යෝජනාවට @ කයි පෙට්ස්කේට ස්තූතියි).

විධාන රේඛාවේ json සැකසීම සම්බන්ධයෙන් පයිතන් මගේ ප්‍රියතම මෙවලම නොවේ. සරල ලස්සන මුද්‍රණය හරි, නමුත් ඔබට ජේසන් හැසිරවීමට අවශ්‍ය නම් එය සංකීර්ණ විය හැකිය. ඔබට ඉක්මනින්ම වෙනම ස්ක්‍රිප්ට් ගොනුවක් ලිවීමට අවශ්‍ය වනු ඇත, ඔබට යතුරු "සමහර-යතුරු" (පයිතන් යුනිකෝඩ්) සහිත යතුරු සමඟ අවසන් විය හැකිය, එමඟින් ක්ෂේත්‍ර තෝරා ගැනීම වඩාත් අපහසු වන අතර ඇත්ත වශයෙන්ම ලස්සන දිශාවට නොයනු ඇත. මුද්‍රණය.

ඔබට jq ද භාවිතා කළ හැකිය :

jq . some.json

ඔබට ප්‍රසාද දීමනාවක් ලෙස වර්ණ ලැබෙනු ඇත (සහ පහසු කිරීමේ විස්තාරණය).

අතිරේක: එක් අතකින් විශාල JSON ගොනු සැකසීමට jq භාවිතා කිරීම සහ අනෙක් පැත්තෙන් ඉතා විශාල jq වැඩසටහනක් තිබීම පිළිබඳ අදහස් දැක්වීමේදී යම් ව්‍යාකූලතාවයක් පවතී. තනි විශාල JSON ආයතනයකින් සමන්විත ගොනුවක් ලස්සනට මුද්‍රණය කිරීම සඳහා, ප්‍රායෝගික සීමාව RAM වේ. තථ්‍ය-ලෝක දත්ත වලින් සමන්විත 2GB ගොනුවක් ලස්සනට මුද්‍රණය කිරීම සඳහා, ලස්සන මුද්‍රණය සඳහා අවශ්‍ය “උපරිම නේවාසික කට්ටල ප්‍රමාණය” 5GB විය (jq 1.5 හෝ 1.6 භාවිතා කළත්). පයිතන් ඇතුළත සිට jq භාවිතා කළ හැකි බව සලකන්න pip install jq.


4
JQ විශිෂ්ටයි නමුත් උපරිම සීමාවක් ඇති බැවින් විශාල ගොනු සඳහා එය නිෂ් less ල ය. (එනම් 1.15mb ගොනුවක් හසුරුවයි
ක්‍රිස් මැකී

4
ඔව්, මචං, නියත වශයෙන්ම, ඔබ කේත රේඛා 10K ට වඩා වැඩි සංඛ්‍යාවක් සහිත jq ෆිල්ටර ලියන්නේ නම්, මම සිතන්නේ ඔබ බයිසිකලයක් සමඟ අඟහරු වෙත යාම වැනි දෙයක් උත්සාහ කරන බවයි.
ගිස්මෝ රනාස්

2
lol: D @ gismo-ranas ගොනුවකට නල කරන ලද json.tool අනුවාදය විශාල ලිපිගොනු වල හොඳින් ක්‍රියා කරයි; මෝඩ වේගයෙන්. මම JQ ට කැමතියි නමුත් කුඩා ගෙවීම් වලින් ඔබ්බට ඕනෑම දෙයක් ආකෘතිකරණය කිරීම (ඔබට බොහෝ පා editor සංස්කාරකවරුන්ට කළ හැකි) එය ළඟා විය නොහැක :) අහඹු එකතු කිරීම: json-generator.com යනු පරීක්ෂණ දත්ත සෑදීම සඳහා ඉතා හොඳ මෙවලමකි
ක්‍රිස් මැකී

5
හෝ යන්තම්:jq '' < some.json
මාරාන්තික_දොර

2
ඇත්ත වශයෙන්ම මම භාවිතා කිරීමට තරයේ නිර්දේශ කරමි python3 -m json.tool <IN >OUT, මෙය JSON විධානයන්හි ක්ෂේත්‍රවල මුල් අනුපිළිවෙල තබා ගනී. පයිතන් පරිවර්තක අනුවාදය 2 ක්ෂේත්‍ර අකාරාදී පිළිවෙලට පිළිවෙලට තබයි, එය බොහෝ විට ඔබට අවශ්‍ය දේ නොවේ.
කායි පෙට්ස්කේ

61

ඔබට බිල්ට් මොඩියුලය pprint (https://docs.python.org/3.6/library/pprint.html) භාවිතා කළ හැකිය .

Json දත්ත සමඟ ගොනුව කියවා මුද්‍රණය කරන්නේ කෙසේද?

import json
import pprint

json_data = None
with open('file_name.txt', 'r') as f:
    data = f.read()
    json_data = json.loads(data)

pprint.pprint(json_data)

5
මෙහි ඇති ගැටළුව නම්, pprint එක හා ද්විත්ව උපුටා දැක්වීම් එකිනෙකට වෙනස් ලෙස භාවිතා කරනු ඇත, නමුත් json ට අවශ්‍ය වන්නේ ද්විත්ව මිල ගණන් පමණි, එබැවින් ඔබේ මුද්‍රිත json තවදුරටත් වලංගු json ලෙස විග්‍රහ නොකරනු ඇත.
drevicko

1
ඔව්, නමුත් එය json ගොනුවක් ප්‍රතිදානය කිරීම පමණි. ප්‍රතිදානය ගෙන නැවත ගොනුවක ලිවීමට නොවේ.
ikreb

53

Pygmentize + Python json.tool = සින්ටැක්ස් ඉස්මතු කිරීම සමඟ ලස්සන මුද්‍රණය

Pygmentize යනු ler ාතක මෙවලමකි. මේක බලන්න.

මම python json.tool pygmentize සමඟ ඒකාබද්ධ කරමි

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json

ස්ථාපන උපදෙස් සඳහා ඉහත සබැඳිය බලන්න.

මෙහි නිරූපණයක් පහත රූපයේ ඇත:

නිරූපණය


1
ඔබේ උදාහරණයේ -gඇත්ත වශයෙන්ම ක්‍රියා නොකරයි;) ආදානය stdin වලින් එන බැවින්, pygmentize හට හොඳ අනුමාන කිරීමක් කළ නොහැක. ඔබ පැහැදිලිවම ලෙක්සර් සඳහන් කළ යුතුය:echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
ඩෙනිස් ද උවදුර

1
ExampleDenisTheMenace මම මෙම උදාහරණ රූපය නිර්මාණය කරන විට එය 2015 දී වැඩ කිරීමට භාවිතා කරන ලදී. එය දැන් මගේ පද්ධතියේ ද ක්‍රියාත්මක වන බවක් නොපෙනේ.
ශුභම් චෞද්රි

36

මෙම ශ්‍රිතය භාවිතා කරන්න, ඔබේ JSON නැවත strහෝ එසේ දැයි මතක තබා ගැනීමට දහඩිය නොදමන්න dict- ලස්සන මුද්‍රණය දෙස බලන්න:

import json

def pp_json(json_thing, sort=True, indents=4):
    if type(json_thing) is str:
        print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents))
    else:
        print(json.dumps(json_thing, sort_keys=sort, indent=indents))
    return None

pp_json(your_json_string_or_dict)

13

විධාන රේඛාවෙන් ලස්සනට මුද්‍රණය කිරීමට සහ ඉන්ඩෙන්ටේෂන් පාලනය කිරීමට හැකිවීම සඳහා ඔබට මේ හා සමාන අන්වර්ථයක් සැකසිය හැකිය:

alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'"

ඉන්පසු අන්වර්ථය මෙම ක්‍රම වලින් එකක් භාවිතා කරන්න:

cat myfile.json | jsonpp
jsonpp < myfile.json

10

Pprint භාවිතා කරන්න: https://docs.python.org/3.6/library/pprint.html

import pprint
pprint.pprint(json)

print() සසඳන විට pprint.pprint()

print(json)
{'feed': {'title': 'W3Schools Home Page', 'title_detail': {'type': 'text/plain', 'language': None, 'base': '', 'value': 'W3Schools Home Page'}, 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'https://www.w3schools.com'}], 'link': 'https://www.w3schools.com', 'subtitle': 'Free web building tutorials', 'subtitle_detail': {'type': 'text/html', 'language': None, 'base': '', 'value': 'Free web building tutorials'}}, 'entries': [], 'bozo': 0, 'encoding': 'utf-8', 'version': 'rss20', 'namespaces': {}}

pprint.pprint(json)
{'bozo': 0,
 'encoding': 'utf-8',
 'entries': [],
 'feed': {'link': 'https://www.w3schools.com',
          'links': [{'href': 'https://www.w3schools.com',
                     'rel': 'alternate',
                     'type': 'text/html'}],
          'subtitle': 'Free web building tutorials',
          'subtitle_detail': {'base': '',
                              'language': None,
                              'type': 'text/html',
                              'value': 'Free web building tutorials'},
          'title': 'W3Schools Home Page',
          'title_detail': {'base': '',
                           'language': None,
                           'type': 'text/plain',
                           'value': 'W3Schools Home Page'}},
 'namespaces': {},
 'version': 'rss20'}

2
pprintවලංගු JSON ලේඛනයක් නිෂ්පාදනය නොකරයි.
selurvedu

5

දේශීය ගොනුවක් ලෙස ඔබේ පරිගණකයේ JSON අවශ්‍ය නොවී, JSON පයිතන් හි ලස්සන ආකාරයකින් කොන්සෝලය වෙත මුද්‍රණය කිරීම පිළිබඳ සරල උදාහරණයක් මෙන්න:

import pprint
import json 
from urllib.request import urlopen # (Only used to get this example)

# Getting a JSON example for this example 
r = urlopen("https://mdn.github.io/fetch-examples/fetch-json/products.json")
text = r.read() 

# To print it
pprint.pprint(json.loads(text))

මට පහත දැක්වෙන දෝෂ පණිවිඩය පයිතන් 3 හි ඇත: "TypeError: JSON වස්තුව 'බයිට්' නොව str විය යුතුය"
ටී


2

ඔබට pprintjson උත්සාහ කළ හැකිය .


ස්ථාපනය

$ pip3 install pprintjson

භාවිතය

Pprintjson CLI භාවිතා කරන ගොනුවකින් JSON ඉතා මුද්‍රණය කරන්න.

$ pprintjson "./path/to/file.json"

Pprintjson CLI භාවිතා කරමින් stdin එකකින් JSON ඉතා මුද්‍රණය කරන්න.

$ echo '{ "a": 1, "b": "string", "c": true }' | pprintjson

Pprintjson CLI භාවිතා කරමින් නූලකින් JSON මුද්‍රණය කරන්න.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }'

1 ක ඉන්ඩෙන්ට් එකක් සහිත නූලකින් JSON ඉතා මුද්‍රණය කරන්න.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -i 1

JSON නූලකින් මුද්‍රණය කර ප්‍රතිදානය ගොනුවකට සුරකින්න. Output.json.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -o ./output.json

ප්‍රතිදානය

රූප විස්තරය මෙහි ඇතුළත් කරන්න


1

දෝෂ මඟහරවා ගැනීමට පෙර json විග්‍රහ කිරීම වඩා හොඳ යැයි මම සිතමි:

def format_response(response):
    try:
        parsed = json.loads(response.text)
    except JSONDecodeError:
        return response.text
    return json.dumps(parsed, ensure_ascii=True, indent=4)

-4

එය පරිපූර්ණ නොවන නමුත් එය කාර්යය ඉටු කරයි.

data = data.replace(',"',',\n"')

ඔබට එය වැඩිදියුණු කළ හැකිය, ඉන්ඩෙන්ටින් සහ තවත් දේ එකතු කළ හැකිය, නමුත් ඔබට පිරිසිදු json එකක් කියවීමට අවශ්‍ය නම්, මෙය යා යුතු මාර්ගයයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.