পাইথন কেন এই JSON ডেটা পার্স করতে পারে না?


1438

আমার কাছে এই ফাইলটি রয়েছে 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 প্রদত্ত কারণে: "এই প্রশ্নটি একটি টাইপো বা এমন সমস্যার কারণে হয়েছিল যা আর পুনরুত্থান করা যায় না।" জসন অবৈধ।
রব

@kederrac সমস্যাটি ব্যবহারের ক্ষেত্রে একটি ত্রুটির কারণে নয় কারণ এটি পুনরুত্পাদন করা যায়।
রব

উত্তর:


2126

আপনার ডেটা বৈধ JSON ফর্ম্যাট নয়। আপনার []যখন থাকা উচিত তখন আপনার কাছে রয়েছে {}:

  • []জেএসএন অ্যারেগুলির জন্য, যা listপাইথনে ডাকা হয়
  • {}জেএসওএন অবজেক্টের জন্য যা 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
ঠিক আছে তাই আমাকে আমার কোডটি নিয়ন্ত্রণ করতে হবে কারণ এই জসন ফাইলটি জাভা অবজেক্ট থেকে উত্পন্ন হয়েছে। ধন্যবাদ।
মিশেল

5
সমাধানের জন্য ধন্যবাদ। আমি এটি প্রিন্ট করার সময় একটি ইউনিকোড প্রতীক পাচ্ছি। (যেমন u'valore ')। কীভাবে এটি প্রতিরোধ করবেন?
ডায়রিফোলিও 30'15

6
চমৎকার তবে পাইথন u'প্রতিটি কীয়ের আগে একটি যোগ করে । কোন ধারণা কেন?
কোডিবাগস্টাইন

7
এজন্য আপনার পাঠ্যটি টাইপ করুন ইউনিকোড স্ট্রিং নয়। বেশিরভাগ সময় ইউনিকোডে জার্মান উমলাটদের জন্য পাঠ্য থাকা এবং অন্যান্য মডিউল / প্রোগ্রাম ইত্যাদির সাথে পাঠ্যের ফলাফল ভাগ করে নেওয়া ভাল। সুতরাং আপনি ভাল!
মাইকেল পি

2
আমি এমন একটি পর্যবেক্ষণ করতে চাই যা আশাবাদী সহায়ক এবং স্পষ্টভাবে বিদ্রূপযুক্ত। আমি প্রিন্ট মডিউলটি প্রিটি-প্রিন্টিং জসন এর জন্য জসন মডিউলকে নিকৃষ্ট বলে মনে করি। আপনি যদি তাদের উভয়টি চেষ্টা করেন তবে আমার মনে হয় আপনি সম্মত হবেন। আমার জসন ডেটা স্ট্রাকচার প্রদর্শন ও ডিবাগ করার জন্য, আমি করছি: আউটপুট = জসন.ডাম্পস (ডেটা স্ট্রাকচার, ইনডেন্ট = 2, সাজ্ট_কিজ = ট্রু) প্রিন্ট (আউটপুট) আমি মনে করি আপনি ইনডেন্ট-কন্ট্রোল, বাছাই এবং বুদ্ধিমান পাবেন ডাম্পগুলিতে লাইন-মোড়ানো () পদ্ধতিটি আপনার পছন্দ অনুসারে যথেষ্ট। যদি আমার চিন্তাভাবনা ভুল হয় তবে কেউ দয়া করে আমাকে জানান।
লারল্ড

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-statement । পাইথন 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
আমি এই উপর একটি ডাউনভোট পেয়েছি। সম্ভবত এটি পরিষ্কার ছিল না, কেন আমি ভাবলাম অন্য উত্তরটি প্রয়োজনীয় necessary বিবৃতি সহ সামঞ্জস্যতা উপর নোট যুক্ত।
বেংট

পিছনে ফিরে আসার জন্য দুঃখিত, তবে প্রস্তাবিত কোডটি data_file openপ্রয়োজনের চেয়ে বেশি দীর্ঘ এড রাখবে ।
বেঞ্চ

২.6 ডকুমেন্টেশন ( docs.python.org/2.6/library/io.html ) উল্লেখ করে "উইথ" প্রসঙ্গে একটি ফাইল খোলাই ফাইল স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।
স্টিভ এস

1
@SteveS। হ্যাঁ, তবে প্রসঙ্গটি রেখে যাওয়ার আগে নয়। pprintমধ্যে ing with-context রাখে data_fileখোলা আর।
বেংট

1
তুমি এটা পছন্দ অ্যাক্সেস @GayanPathirage data["om_points"], data["masks"]["id"]। ধারণাটি হ'ল আপনি 'কী পাথ' নির্দিষ্ট করে অভিধানের যে কোনও স্তরে পৌঁছতে পারবেন। আপনি যদি KeyErrorব্যতিক্রম পান তবে এর অর্থ কীটিতে কীটি নেই। টাইপগুলি সন্ধান করুন বা আপনার অভিধানের কাঠামোটি পরীক্ষা করুন।
নুহমান

71

জাস্টিন পিলের উত্তরটি সত্যিই সহায়ক, তবে আপনি যদি পাইথন 3 ব্যবহার করেন তবে জেএসওএন এইভাবে করা উচিত:

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
ড্যান হাল্মে

28
এই জবাবটি পুরো ফাইলটিকে মেমোরিতে পড়তে হবে যখন তা করার দরকার নেই এবং পরামর্শ দেয় যে পাইথন 3 জেএসওএন ফাইলটি অলসভাবে পড়া যায় না, যা অসত্য। আমি দুঃখিত, তবে এটি স্পষ্ট ডাউনওয়েট।
asukasz Rogalski

10
এই উত্তরটি সঠিক নয়। পাইথন 3 এ ওপেন ফাইল হ্যান্ডলারের সাহায্যে json.load ব্যবহার না করার কোনও কারণ নেই। ডাউনভোটের জন্য দুঃখিত, তবে আপনি উপরের মন্তব্যগুলি খুব মনোযোগ দিয়ে পড়েছেন বলে মনে হয় না।
সন্ধিক্ষেত্র

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.loadsএকাধিক জসন বস্তুগুলি ডিকোড করে না। অন্যথায়, আপনি 'অতিরিক্ত ডেটা' ত্রুটি পান।
ইয়াসিন_লম

এটি সেরা উত্তর। অন্যথায়, এটি 'অতিরিক্ত ডেটা' ত্রুটি দেয়।
আর্থএক্স

38
ফাইলটিতে মিটলিপল জসন বস্তু থাকার অর্থ ফাইলটি নিজেই বৈধ জেএসন নয়। আপনার যদি কোনও জসন ফাইলে অন্তর্ভুক্ত করার জন্য একাধিক অবজেক্ট থাকে তবে সেগুলি ফাইলের শীর্ষ স্তরের একটি অ্যারেতে থাকা উচিত।
dusktreader

একটি ফাইলে একাধিক জসন অবজেক্ট থাকার অর্থ ফাইলটি কোনও একক জেসন অবজেক্ট নয়। এটা সুস্পষ্ট সাজানোর। অবজেক্টগুলির মধ্যে একটি একক অ্যারে তৈরি করা একটি সুস্পষ্ট কর্মসীমা। তবে জেএসএন হ'ল ডিজাইন দ্বারা স্পষ্টভাবে সমাপ্ত, প্রায় প্রতিটি স্তরে (দ্বারা }, ]বা ")। অতএব আপনি অস্পষ্টতা ছাড়াই একক স্ট্রিং বা একক ফাইলে একাধিক অবজেক্টকে সত্যই সংযুক্ত করতে পারেন। এখানে সমস্যাটি হ'ল পার্সার একক বস্তুর প্রত্যাশার ব্যর্থ হয় যখন এটি একাধিক বস্তুর পাস করে।
এমসাল্টারস

এ্যাড করে একটি ফাইল একাধিক তাদেরকে JSON বস্তু সংরক্ষণ: যে জন্য একটি "মান" হয় - jsonlines.org/examples মধ্যে .jsonl(JSON লাইন), বস্তু একটি newline অক্ষর যা তুচ্ছ পার্স জন্য প্রাক-প্রক্রিয়াকরণ তোলে দ্বারা বিভক্ত করা হয়, এবং পারেন প্রারম্ভ / শেষ চিহ্নিতকারীদের সম্পর্কে চিন্তা না করে সহজেই বিভক্ত / ব্যাচ ফাইলগুলি তৈরি করতে।
সেবি

13

"আল্ট্রা জেএসওএন" বা কেবল "উজসন" []আপনার জেএসওএন ফাইল ইনপুটটিতে থাকতে পারে । আপনি যদি JSON উপাদানগুলির তালিকা হিসাবে আপনার প্রোগ্রামটিতে একটি JSON ইনপুট ফাইলটি পড়ছেন; যেমন, [{[{}]}, {}, [], etc...]উজসন অভিধানের তালিকাগুলির তালিকাগুলির তালিকাগুলির যেকোন স্বেচ্ছাসেবী ক্রম পরিচালনা করতে পারে dictionaries

আপনি পাইথন প্যাকেজ সূচীতে উজসন খুঁজে পেতে পারেন এবং এপিআই পাইথনের বিল্ট-ইন jsonলাইব্রেরির প্রায় অনুরূপ ।

আপনি যদি বড় বড় JSON ফাইল লোড করেন তবে উজসন আরও দ্রুত। প্রদত্ত একই লিঙ্কে পাইথন জেএসওএন লাইব্রেরির তুলনায় আপনি পারফরম্যান্সের বিশদটি দেখতে পারেন।


9

আপনি যদি পাইথন 3 ব্যবহার করে থাকেন তবে আপনি নিজের ( connection.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

1
এটি
২.7.৫-

17
এটি ফাইলের হ্যান্ডেলটি উন্মুক্ত করে দেয়। withবিবৃতি ব্যবহার করা আরও ভাল হবে
কোরি গোল্ডবার্গ

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

যদি আমরা "মানচিত্র" এর কতগুলি পর্যবেক্ষণ আছে তা গণনা করার জন্য একটি কলাম যুক্ত করতে চাই, আমরা কীভাবে এই ফাংশনটি লিখতে পারি?
চেনসি

5

এই বিশ্লেষণে দুটি প্রকার রয়েছে।

  1. সিস্টেমের পথ থেকে কোনও ফাইল থেকে ডেটা পার্স করা
  2. রিমোট URL থেকে JSON পার্স করা হচ্ছে।

একটি ফাইল থেকে, আপনি নিম্নলিখিত ব্যবহার করতে পারেন

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

এই আর্টিকেলটি দুটি দৃশ্যের সাহায্যে পূর্ণ বিশদকরণ এবং প্রাপ্ত মানগুলি ব্যাখ্যা করে। পাইথন ব্যবহার করে জেএসএনকে পার্সিং করা হচ্ছে


4

পাইথন 3 ব্যবহারকারী হিসাবে ,

বিশেষত আপনি যখন ফাইল থেকে জসন ডেটা পড়েন তখন loadএবং loadsপদ্ধতির মধ্যে পার্থক্যটি গুরুত্বপূর্ণ।

দস্তাবেজে যেমন বলা হয়েছে:

json.load:

এই রূপান্তর টেবিলটি ব্যবহার করে পাইথন অবজেক্টে fp (a .read () - সমর্থনকারী পাঠ্য ফাইল বা একটি JSON নথি সম্বলিত বাইনারি ফাইল) ডেসিরিয়াল করুন।

json.loads:

json.loads: এই রূপান্তর টেবিলটি ব্যবহার করে পাইথন অবজেক্টে ডিসরিয়ালাইজ করুন (একটি স্ট্রিং, বাইটস বা জাইটসন ডকুমেন্ট সম্বলিত বাইটারি উদাহরণ)।

বাইনারি ফাইল পড়তে সক্ষম হওয়ায় json.load পদ্ধতি সরাসরি খোলা জসন নথিটি পড়তে পারে।

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

ফলস্বরূপ, আপনার জসন ডেটা এই রূপান্তর টেবিল অনুযায়ী নির্দিষ্ট ফর্ম্যাট হিসাবে হিসাবে উপলব্ধ:

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


এটি কীভাবে জিজ্ঞাসিত প্রশ্নের উত্তর? ব্যবহারকারী জসন ফাইল লোড করতে সঠিক পদ্ধতিটি ব্যবহার করছিলেন।
রাজ006
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.