පයිතන්ට මෙම JSON දත්ත විග්‍රහ කළ නොහැක්කේ ඇයි?


1444

මට මෙම JSON ගොනුවක ඇත:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [
        "id": "valore"
    ],
    "om_points": "value",
    "parameters": [
        "id": "valore"
    ]
}

මම මෙම පිටපත ලිව්වේ සියලුම JSON දත්ත මුද්‍රණය කිරීම සඳහා ය:

import json
from pprint import pprint

with open('data.json') as f:
    data = json.load(f)

pprint(data)

මෙම වැඩසටහන ව්‍යතිරේකයක් මතු කරයි, නමුත්:

Traceback (most recent call last):
  File "<pyshell#1>", line 5, in <module>
    data = json.load(f)
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)

මට JSON විග්‍රහ කර එහි අගයන් උකහා ගන්නේ කෙසේද?


@kederrac ලබා දී ඇති හේතුව නිසා: "මෙම ප්‍රශ්නය ඇති වූයේ යතුරු ලියනයකින් හෝ තවදුරටත් ප්‍රතිනිෂ්පාදනය කළ නොහැකි ගැටළුවක් නිසා ය." Json අවලංගුයි.
රොබ්

@kederrac ගැටළුව ඇතිවන්නේ භාවිතයේ ඇති වූ දෝෂයක් නිසා එය ප්‍රතිනිෂ්පාදනය කළ හැකි නිසා නොවේ.
රොබ්

Answers:


2133

ඔබගේ දත්ත වලංගු JSON ආකෘතිය නොවේ. ඔබට තිබිය යුතු []විට ඔබ සතුව ඇත {}:

  • []JSON අරා සඳහා වන අතර ඒවා listපයිතන් ලෙස හැඳින්වේ
  • {}JSON වස්තු සඳහා වන අතර ඒවා dictපයිතන් ලෙස හැඳින්වේ

ඔබගේ JSON ගොනුව පෙනිය යුතු ආකාරය මෙන්න:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": {
        "id": "valore"
    },
    "om_points": "value",
    "parameters": {
        "id": "valore"
    }
}

එවිට ඔබට ඔබේ කේතය භාවිතා කළ හැකිය:

import json
from pprint import pprint

with open('data.json') as f:
    data = json.load(f)

pprint(data)

දත්ත සමඟ, ඔබට දැන් එවැනි අගයන් සොයාගත හැකිය:

data["maps"][0]["id"]
data["masks"]["id"]
data["om_points"]

ඒවා අත්හදා බලා එය අර්ථවත් කිරීමට පටන් ගන්නේ දැයි බලන්න.


1
හරි ඉතින් මට මගේ කේතය පාලනය කිරීමට සිදුවන්නේ මෙම json ගොනුව ජාවා වස්තුවකින් ජනනය වන බැවිනි. ස්තූතියි.
මයිකල්

5
විසඳුමට ස්තූතියි. මට එය මුද්‍රණය කරන විට යුනිකෝඩ් සංකේතයක් ලැබෙනවා. (උදා: u'valore '). එය වළක්වා ගන්නේ කෙසේද?
දිනපොත

6
හොඳයි, නමුත් පයිතන් u'සෑම යතුරකටම පෙර එකතු කරයි . කිසියම් අදහසක් ඇයි?
කෝඩි බග්ස්ටයින්

7
ඔබේ පා text ය යුනිකෝඩ් නොව නූල් වර්ගයක් වන්නේ එබැවිනි. බොහෝ විට ජර්මානු umlauts සඳහා යුනිකෝඩ් තුළ පෙළ තිබීම සහ වෙනත් මොඩියුල / වැඩසටහන් ආදිය සමඟ පෙළ ප්‍රති results ල බෙදා ගැනීම වඩා හොඳය. ඉතින් ඔබ හොඳයි!
මයිකල් පී

2
නිරීක්‍ෂණයක් කිරීමට මම කැමතියි. ලස්සන මුද්‍රණ json සඳහා pprint මොඩියුලය json මොඩියුලයට වඩා පහත් බව මට පෙනේ. ඔබ ඔවුන් දෙදෙනාම උත්සාහ කළහොත්, ඔබ එකඟ වනු ඇතැයි මම සිතමි. මගේ json දත්ත ව්‍යුහයන් ප්‍රදර්ශනය කිරීම සහ නිදොස් කිරීම සඳහා, මම කළේ: output = json.dumps (data_structure, indent = 2, sort_keys = True) print (output) මුද්‍රණ (ප්‍රතිදානය) ඔබට ඉන්ඩෙන්ට්-පාලනය, වර්ග කිරීම සහ බුද්ධිමත් බව පෙනේ ඔබේ කැමැත්තට සරිලන පරිදි ඩම්ප්ස් () ක්‍රමයේ රේඛා ඔතා. මගේ සිතුවිල්ල වැරදියි නම්, කරුණාකර යමෙක් මට දන්වන්න.
ලාරෝල්ඩ්

307

ඔබේ data.jsonපෙනුම මේ වගේ විය යුතුයි:

{
 "maps":[
         {"id":"blabla","iscategorical":"0"},
         {"id":"blabla","iscategorical":"0"}
        ],
"masks":
         {"id":"valore"},
"om_points":"value",
"parameters":
         {"id":"valore"}
}

ඔබේ කේතය විය යුත්තේ:

import json
from pprint import pprint

with open('data.json') as data_file:    
    data = json.load(data_file)
pprint(data)

මෙය ක්‍රියාත්මක වන්නේ පයිතන් 2.6 සහ ඊට ඉහළින් පමණක් බව withසලකන්න . පයිතන් 2.5 භාවිතයේදී from __future__ import with_statement, පයිතන් <= 2.4 හි, ජස්ටින් පීල්ගේ පිළිතුර බලන්න , මෙම පිළිතුර පදනම් වී ඇත.

ඔබට දැන් මේ වගේ තනි අගයන් වෙත පිවිසිය හැකිය:

data["maps"][0]["id"]  # will return 'blabla'
data["masks"]["id"]    # will return 'valore'
data["om_points"]      # will return 'value'

7
මට මේ ගැන අඩු තක්සේරුවක් ලැබුණා. සමහර විට එය පැහැදිලි නැත, වෙනත් පිළිතුරක් අවශ්‍ය යැයි මා සිතුවේ ඇයි. ප්‍රකාශය සමඟ ගැළපුම පිළිබඳ සටහනක් එක් කරන ලදි.
බෙන්ට්

ආපසු පෙරළීම ගැන කණගාටුයි, නමුත් යෝජිත කේතය data_file openඅවශ්‍ය ප්‍රමාණයට වඩා දිගු වේ.
බෙන්ට්

2.6 ප්‍රලේඛනය ( docs.python.org/2.6/library/io.html ) වෙත යොමු කරමින් , "with" සන්දර්භය තුළ ගොනුවක් විවෘත කිරීමෙන් ගොනුව ස්වයංක්‍රීයව වැසෙනු ඇත.
ස්ටීව් එස්.

1
Te ස්ටීව්ස්. ඔව්, නමුත් සන්දර්භය ඉතිරි වීමට පෙර නොවේ. pprintතුළ ආශා දනවන්නක් with-context කරන්නහු data_fileවිවෘත තවදුරටත්.
බෙන්ට්

1
AyGayanPathirage ඔබ එයට ප්‍රවේශ වන්නේ data["om_points"], data["masks"]["id"]. 'ප්‍රධාන මාර්ග' සඳහන් කිරීමෙන් ඔබට ශබ්දකෝෂයක ඕනෑම මට්ටමකට ළඟා විය හැකිය. ඔබට KeyErrorව්‍යතිරේකයක් ලැබුනහොත් එයින් අදහස් වන්නේ යතුර මාර්ගයෙහි නොපවතින බවයි. යතුරු ලියනය සඳහා අවධානය යොමු කරන්න හෝ ඔබේ ශබ්ද කෝෂයේ ව්‍යුහය පරීක්ෂා කරන්න.
නුමාන්

72

ජස්ටින් පීල්ගේ පිළිතුර සැබවින්ම ප්‍රයෝජනවත් වේ, නමුත් ඔබ පයිතන් 3 කියවන්නේ නම් JSON මේ ආකාරයට කළ යුතුය:

with open('data.json', encoding='utf-8') as data_file:
    data = json.loads(data_file.read())

සටහන: json.loadsවෙනුවට භාවිතා කරන්න json.load. පයිතන් 3 හි, json.loadsනූල් පරාමිතියක් ගනී. json.loadගොනුවක් වැනි වස්තු පරාමිතියක් ගනී. data_file.read()නූල් වස්තුවක් ලබා දෙයි.

ඇත්තම කිව්වොත්, බොහෝ අවස්ථාවන්හිදී සියලු ජේසන් දත්ත මතකයට පැටවීම ගැටලුවක් යැයි මම නොසිතමි.


10
පයිතන් 3 json.loadහි අනුග්‍රහයෙන් වැළකී සිටිය යුත්තේ ඇයි .loads?
සියරින්

10
ඔබ සම්බන්ධ කළ පිටුව මඟ හැරීම ගැන කිසිවක් නොකියයි load.
ඩෑන් හල්ම්

29
අවශ්‍ය නොවන විට මෙම පිළිතුර මුළු ගොනුවම මතකයට කියවන අතර පයිතන් 3 හි JSON ගොනු කම්මැලි ලෙස කියවිය නොහැකි බව යෝජනා කරයි, එය අසත්‍යයකි. මට කණගාටුයි, නමුත් එය පැහැදිලි පසුබෑමකි.
Łukasz Rogalski

10
මෙම පිළිතුර නිවැරදි නොවේ. Python3 හි විවෘත ගොනු හසුරුවන්නෙකු සමඟ json.load භාවිතා නොකිරීමට කිසිදු හේතුවක් නැත. පහත වැටීම ගැන කණගාටුයි, නමුත් ඔබ ඉහත අදහස් ඉතා ප්‍රවේශමෙන් කියවූ බවක් නොපෙනේ.
dusktreader

5
+1 මෙම පිළිතුර විශිෂ්ටයි! ඒ සඳහා ඔබට ස්තූතිවන්ත වන අතර, නූල් භාවිතා කළ හැකි ශ්‍රිතයක් සෙවීම සඳහා මා දුර බැහැර යාමෙන් මා ඉවත් කළේ මා ගොනු හා නැති ජාල ඉල්ලීම් සමඟ පමණි.
පුද්ගලයින්

54
data = []
with codecs.open('d:\output.txt','rU','utf-8') as f:
    for line in f:
       data.append(json.loads(line))

8
ඔබට ගොනුවක් තුළ json වස්තු කිහිපයක් තිබේ නම් මෙය නිවැරදි විසඳුම වේ. json.loadsබහු json වස්තු විකේතනය නොකරයි. එසේ නොමැතිනම් ඔබට 'අමතර දත්ත' දෝෂයක් ලැබේ.
yasin_alm

මෙය හොඳම පිළිතුරයි. එසේ නොමැති නම්, එය 'අමතර දත්ත' දෝෂයක් ලබා දෙයි.
Earthx9

39
ගොනුවක විකෘති json වස්තු තිබීම යන්නෙන් අදහස් වන්නේ ගොනුව සත්‍ය වශයෙන්ම වලංගු නොවන json නොවන බවයි. ඔබට json ගොනුවකට ඇතුළත් කිරීමට බහුවිධ වස්තු තිබේ නම්, ඒවා ගොනුවේ ඉහළ මට්ටමේ අරාවෙහි අඩංගු විය යුතුය.
dusktreader

ගොනුවක බහු json වස්තු තිබීම යන්නෙන් අදහස් වන්නේ ගොනුව තනි json වස්තුවක් නොවන බවයි. එය එක්තරා ආකාරයක පැහැදිලිය. වස්තූන්ගෙන් තනි අරාවක් සෑදීම පැහැදිලිව පෙනෙන විසඳුමකි. නමුත් JSON යනු සෑම මට්ටමකින්ම (විසින් }, ]හෝ ") සැලසුම් වලින් පැහැදිලිවම අවසන් කර ඇත . එබැවින් ඔබට අවිනිශ්චිතතාවයකින් තොරව තනි වස්තුවක හෝ තනි ගොනුවක බහුවිධ වස්තු සංයුක්ත කළ හැකිය. මෙහි ඇති ගැටළුව නම්, එක් වස්තුවක් අපේක්ෂා කරන විග්‍රහකයෙකු එක් වස්තුවකට වඩා පසු කළ විට එය අසමත් වීමයි.
MSalters

බහු JSON ගබඩා දැන්වීම බෙදා ගන්න තනි ගොනුව තුල විරුද්ධ: a ඒ සඳහා "සම්මත" පවතී - jsonlines.org/examples දී .jsonl(json රැහැන්), වස්තූන් සුළු මාණකරනය ක්රියාත්මක කිරීම සඳහා පෙර සැකසුම වන පරිදි නව පේලීයක් වෙන්, සහ ඉඩ ඇත ආරම්භක / අවසන් සලකුණු ගැන කරදර නොවී පහසුවෙන් ගොනු / කණ්ඩායම් ගොනු කිරීමට.
සෙබී

13

"අල්ට්‍රා JSON" හෝ "ujson" මඟින් []ඔබේ JSON ගොනු ආදානය තුළ හැසිරවිය හැක. ඔබ JSON මූලද්‍රව්‍ය ලැයිස්තුවක් ලෙස ඔබේ වැඩසටහනට JSON ආදාන ගොනුවක් කියවන්නේ නම්; වැනි [{[{}]}, {}, [], etc...], ශබ්දකෝෂවල ලැයිස්තු, ශබ්ද කෝෂවල ඕනෑම අත්තනෝමතික අනුපිළිවෙලක් උජ්සන්ට හැසිරවිය හැකිය.

ඔබට පයිතන් පැකේජ දර්ශකයේ උජ්සන් සොයා ගත හැකි අතර ඒපීඅයි පයිතන්ගේ බිල්ට් jsonපුස්තකාලයට බොහෝ දුරට සමාන වේ .

ඔබ විශාල JSON ගොනු පූරණය කරන්නේ නම් ujson ද වඩා වේගවත් වේ. සපයා ඇති එකම සබැඳියෙන් අනෙකුත් පයිතන් JSON පුස්තකාල හා සැසඳීමේදී ඔබට කාර්ය සාධන විස්තර දැකිය හැකිය.


9

ඔබ Python3 භාවිතා කරන්නේ නම්, ඔබට ඔබගේ ( connection.jsonගොනුව) JSON වෙනස් කිරීමට උත්සාහ කළ හැකිය :

{
  "connection1": {
    "DSN": "con1",
    "UID": "abc",
    "PWD": "1234",
    "connection_string_python":"test1"
  }
  ,
  "connection2": {
    "DSN": "con2",
    "UID": "def",
    "PWD": "1234"
  }
}

ඉන්පසු පහත කේතය භාවිතා කරන්න:

connection_file = open('connection.json', 'r')
conn_string = json.load(connection_file)
conn_string['connection1']['connection_string_python'])
connection_file.close()
>>> test1

17
මෙමඟින් ගොනු හසුරුව විවෘත වේ. withප්‍රකාශයක් භාවිතා කිරීම වඩා හොඳ වනු ඇත
කොරී ගෝල්ඩ්බර්ග්

6

මෙම විග්‍රහයේ වර්ග දෙකක් තිබේ.

  1. පද්ධති මාර්ගයකින් ගොනුවකින් දත්ත විග්‍රහ කිරීම
  2. දුරස්ථ URL වෙතින් JSON විග්‍රහ කිරීම.

ගොනුවකින් ඔබට පහත සඳහන් දෑ භාවිතා කළ හැකිය

import json
json = json.loads(open('/path/to/file.json').read())
value = json['key']
print json['value']

මෙම ආක්ටිකලය අවස්ථා දෙකක් භාවිතා කරමින් සම්පූර්ණ විග්‍රහ කිරීම සහ අගයන් ලබා ගැනීම පැහැදිලි කරයි. පයිතන් භාවිතයෙන් JSON විග්‍රහ කිරීම


"පද්ධතියේ ගොනුවකින් දත්ත විග්‍රහ කිරීම" ක්‍රමයට බොහෝම ස්තූතියි!
ජැක්ආර්

6

මෙන්න ඔබ නවීකරණය කරන ලද data.jsonගොනුව සමඟ යන්න :

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [{
        "id": "valore"
    }],
    "om_points": "value",
    "parameters": [{
        "id": "valore"
    }]
}

පහත දැක්වෙන රේඛා භාවිතා කිරීමෙන් ඔබට කොන්සෝලය මත දත්ත ඇමතීමට හෝ මුද්‍රණය කළ හැකිය:

import json
from pprint import pprint
with open('data.json') as data_file:
    data_item = json.load(data_file)
pprint(data_item)

මේ සඳහා අපේක්ෂිත ප්‍රතිදානය print(data_item['parameters'][0]['id']):

{'maps': [{'id': 'blabla', 'iscategorical': '0'},
          {'id': 'blabla', 'iscategorical': '0'}],
 'masks': [{'id': 'valore'}],
 'om_points': 'value',
 'parameters': [{'id': 'valore'}]}

මේ සඳහා අපේක්ෂිත ප්‍රතිදානය print(data_item['parameters'][0]['id']):

valore

“සිතියම්” සතුව නිරීක්ෂණ කීයක් තිබේදැයි ගණනය කිරීමට තීරුවක් එක් කිරීමට අප කැමති නම්, මෙම ශ්‍රිතය ලිවිය හැක්කේ කෙසේද?
චෙන්සි

4

Python3 භාවිතා කරන්නෙකු ලෙස ,

විශේෂයෙන් ඔබ ගොනුවෙන් json දත්ත කියවන විට loadසහ loadsක්‍රම අතර වෙනස වැදගත් වේ.

ලේඛනයේ සඳහන් පරිදි:

json.load:

මෙම පරිවර්තන වගුව භාවිතා කරමින් පයිතන් වස්තුවකට fp (a .read () - සහය දක්වන පෙළ ගොනුවක් හෝ JSON ලේඛනයක් අඩංගු ද්විමය ගොනුවක්) Deserialize කරන්න.

json.loads:

json.loads: මෙම පරිවර්තන වගුව භාවිතා කරමින් පයිතන් වස්තුවකට s (str, බයිට් හෝ JSON ලේඛනයක් අඩංගු බයිට්ආරේ උදාහරණයක්) Deserialize කරන්න.

json.load ක්‍රමයට ද්විමය ගොනුව කියවිය හැකි බැවින් විවෘත කළ json ලේඛනය කෙලින්ම කියවිය හැකිය.

with open('./recipes.json') as data:
  all_recipes = json.load(data)

එහි ප්‍රති As ලයක් ලෙස, මෙම පරිවර්තන වගුව අනුව නිශ්චිතව දක්වා ඇති ආකෘතියෙන් මෙන් ඔබේ json දත්ත ලබා ගත හැකිය:

https://docs.python.org/3.7/library/json.html#json-to-py-table


අසන ලද ප්‍රශ්නයට මෙය පිළිතුරක් වන්නේ කෙසේද? පරිශීලකයා json ගොනුව පූරණය කිරීම සඳහා නිවැරදි ක්‍රමය භාවිතා කරමින් සිටියේය.
රාජ් 006
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.