파이썬이 왜이 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 주어진 이유 : "이 질문은 오타 나 더 이상 재현 할 수없는 문제로 인해 발생했습니다." json이 유효하지 않습니다.

@kederrac이 문제는 재생산 할 수 없기 때문에 사용상의 오류로 인해 발생합니다.

답변:


2128

데이터가 유효한 JSON 형식 이 아닙니다 . 당신은 당신이해야 []할 때 {}:

  • []list파이썬에서 호출되는 JSON 배열 용
  • {}dict파이썬에서 호출되는 JSON 객체 용

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 파일은 Java 객체에서 생성되므로 코드를 제어해야합니다. 감사.
Michele

5
솔루션 주셔서 감사합니다. 인쇄하는 동안 유니 코드 기호가 나타납니다. (예 : u'valore '). 그것을 방지하는 방법?
diaryfolio

6
멋지지만 파이썬은 u'각 키 앞에 사전을 추가합니다 . 왜 그런지 알아?
CodyBugstein

7
따라서 텍스트가 문자열이 아닌 유니 코드 유형입니다. 대부분의 경우 독일어 움라우트와 다른 모듈 / 프로그램 등과 텍스트 결과를 공유하기 위해 텍스트를 유니 코드로 작성하는 것이 좋습니다. 그래서 당신은 좋다!
Michael P

2
희망적으로 도움이되고 확실히 아이러니 한 관찰을하고 싶습니다. pprint 모듈이 json을 예쁘게 인쇄하기 위해 json 모듈보다 열등하다는 것을 알았습니다. 둘 다 시도하면 동의 할 것입니다. 내 json 데이터 구조를 표시하고 디버깅하기 위해 다음을 수행했습니다. 출력 = json.dumps (data_structure, indent = 2, sort_keys = True) print (output) 들여 쓰기 제어, 정렬 및 지능을 찾을 수 있다고 생각합니다 dumps () 메소드의 라인 랩핑은 원하는대로합니다. 내 생각이 틀렸다면 누군가 알려주세요.
Larold

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)

이것은 with-statement에 의존하기 때문에 Python 2.6 이상에서만 작동합니다 . Python 2.5 use from __future__ import with_statement에서는 Python <= 2.4에서 Justin Peel의 답변을 참조하십시오 .이 답변은 기반입니다.

다음과 같이 단일 값에 액세스 할 수도 있습니다.

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

7
나는 이것에 대한 downvote를 얻었다. 어쩌면 다른 대답이 필요하다고 생각한 이유가 분명하지 않을 수도 있습니다. with 문의 호환성에 대한 메모를 추가했습니다.
Bengt

롤백에 대해 죄송하지만 제안 된 코드는 data_file open필요한 것보다 오래 유지 됩니다.
Bengt

2.6 문서 ( docs.python.org/2.6/library/io.html )를 참조 하여 "with"컨텍스트에서 파일을 열면 파일이 자동으로 닫힙니다.
Steve S.

1
@SteveS. 예, 그러나 상황이 떠나기 전에는 아닙니다. pprint에 보내고 with-context은 계속 data_file열려있는 이상.
Bengt

1
@GayanPathirage data["om_points"], 처럼 액세스하십시오 data["masks"]["id"]. 아이디어는 '키 경로'를 지정하여 사전의 모든 레벨에 도달 할 수 있다는 것입니다. KeyError예외 가 발생하면 경로에 키가 존재하지 않음을 의미합니다. 오타를 찾거나 사전 구조를 확인하십시오.
Nuhman

71

Justin Peel의 답변 은 실제로 도움이되지만 Python 3을 사용하는 경우 JSON을 읽는 경우 다음과 같이해야합니다.

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

참고 : json.loads대신 사용하십시오 json.load. Python 3에서는 json.loads문자열 매개 변수를 사용합니다. json.load파일과 유사한 객체 매개 변수를 사용합니다. data_file.read()문자열 객체를 반환합니다.

솔직히 말해서, 모든 json 데이터를 대부분의 경우 메모리에로드하는 것이 문제가되지 않는다고 생각합니다.


10
파이썬 3 json.load에서는 왜 피해야 .loads하는가?
Zearin

10
링크 한 페이지는 피하는 것에 대해 아무 말도하지 않습니다 load.
Dan Hulme

28
이 대답은 필요하지 않을 때 전체 파일을 메모리로 읽습니다. 파이썬에서 JSON 파일을 느리게 읽을 수 없다는 것을 암시합니다. 미안하지만 명백한 공감대입니다.
Łukasz Rogalski

10
이 답변은 정확하지 않습니다. python3에서 열린 파일 핸들러로 json.load를 사용하지 않는 이유는 없습니다. downvote에 대해 죄송하지만 위의 의견을 매우 신중하게 읽는 것 같지는 않습니다.
dusktreader

5
+1이 답변은 훌륭합니다! 그 점에 감사하고 문자열을 사용할 수있는 기능을 찾기 위해 멀어졌습니다. 파일이 아닌 문자열 및 네트워크 요청으로 만 작동합니다!
newpeople

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 객체를 저장 등록 - 거기에 대한 "표준"이다 jsonlines.org/examples 에서 .jsonlJSON (라인), 오브젝트가 사소한 파싱 선주문 처리하게 개행 문자에 의해 분리되며, 허용 시작 / 종료 마커에 대한 걱정없이 파일을 쉽게 분할 / 배치 할 수 있습니다.
Sebi

13

"Ultra JSON"또는 간단히 "ujson"은 []JSON 파일 입력을 처리 할 수 ​​있습니다 . JSON 요소 목록으로 프로그램에서 JSON 입력 파일을 읽는 경우; 예를 들어, [{[{}]}, {}, [], etc...]ujson은 임의의 순서의 사전 목록, 사전 사전을 처리 할 수 ​​있습니다.

Python 패키지 인덱스 에서 ujson을 찾을 수 있으며 API는 Python의 내장 json라이브러리 와 거의 동일합니다 .

더 큰 JSON 파일을로드하는 경우 ujson도 훨씬 빠릅니다. 제공된 동일한 링크에서 다른 Python 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

1
이것은 2.7.5에서도 작동합니다
siddardha

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

"맵"에 몇 개의 관측치가 있는지 계산하기 위해 열을 추가하려면이 함수를 어떻게 작성할 수 있습니까?
Chenxi

5

이 구문 분석에는 두 가지 유형이 있습니다.

  1. 시스템 경로에서 파일의 데이터 구문 분석
  2. 원격 URL에서 JSON을 구문 분석합니다.

파일에서 다음을 사용할 수 있습니다

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

이 arcticle은 두 가지 시나리오를 사용하여 전체 구문 분석 및 값 가져 오기에 대해 설명합니다. 파이썬을 사용하여 JSON 파싱


4

python3 사용자 로서

loadloads방법 의 차이점은 특히 파일에서 json 데이터를 읽을 때 중요합니다.

문서에 명시된 바와 같이 :

json.load :

이 변환 표를 사용하여 fp (.read () 지원 텍스트 파일 또는 JSON 문서를 포함하는 이진 파일)를 Python 객체로 직렬화 해제하십시오.

json.loads :

json.loads :이 변환 표를 사용하여 s (JSON 문서를 포함하는 str, bytes 또는 bytearray 인스턴스)를 Python 객체로 직렬화 해제합니다.

json.load 메소드는 바이너리 파일을 읽을 수 있기 때문에 열린 json 문서를 직접 읽을 수 있습니다.

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

결과적으로이 변환 표에 따라 지정된 형식으로 JSON 데이터를 사용할 수 있습니다.

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


이것이 질문에 대한 답변입니까? 사용자가 올바른 방법을 사용하여 json 파일을로드했습니다.
Raj006
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.