2016-06-14 11 views
0

Open Refine을 사용하여 지저분한 JSON 문자열 (40k 라인)의 데이터 세트를 분석하려고했으나 JSON의 순서가 지정되지 않았기 때문에, JSON 객체 라인 중 일부는 리턴되어 파일로 기록 될 때 혼란스러워졌습니다.엄격한 JSON 소비, Reorder를위한 특정 JSON 스키마의 값 재 배열 방법

일부 개체의 키가 누락되어 일부 개체의 순서가 잘못되었습니다. 예 :

1 {"about":"foo", "category":"bar", "id":"123", "cat_list": ["category1":"foo2"]} 
2 {"id":"22","about":"barFoo", "category":"NotABar"} 
3 {"about":"barbar", "category":"website", "id":"3333", "cat_list": ["category1":"foo22"]} 
.... 
.... 
.... 
40,000 {"about":"bar123", "category":"publish", "id":"3323", "cat_list": ""} 

문제 :

열기 조정에 데이터를 가져 오기, 프로그램은 파일을 읽을 때와 비교하기 위해 특정 스키마를 요청합니다. 그런 다음 제공된 파일을 읽고 행의 각 JSON 객체를 스키마와 비교하고 스키마와 얼마나 잘 일치하는지에 따라 가져 오기 또는 삭제합니다! 결과적으로 많은 항목이 빠져 있습니다!

이상적 :

파이썬을 사용하여, 내가 지정한 특정 스키마에 JSON 객체의 순서를 변경하고 싶습니다.

예 :

1 {"about": .... 
2 {"about": .... 
3 {"about": .... 
.... 
.... 
.... 
40,000 {"about": .... 

내가 : 다음 JSON과 키 - 값의 각 라인을 재 배열

{"about":"", "category":"", "id":"", "cat_list": ""} 

이 특정 형식에있을

지정된 스키마 내가 어떻게 효율적으로이 일을 할 수 있는지 완전히 모르겠다.

편집 :

나는 이것을 구성하기위한 스크립트를 작성하기로 결정했습니다. 나는 복잡한 필드의 일부를 제거하고 전체 .JSON 파일이 : 아직

{"name":"Carstar Bridgewater", 
"category":"Automotive", 
"about":"We are Bridgewaters largest professional collision centre and are committed to being there for customer cars and communities when they need us.", 
"country":"Canada", 
"state":"NS", 
"city":"Bridgewater 
"}, 
{"name":"Febreze", 
"category":"Product/Service 
", 
"about":"Freshness that eliminates odorsso you can breathe happy.", 
"country":"Added Nothing", 
"state":"Added Nothing", 
"city":"Added Nothing"}, 
{"name":"Custom Wood & Acrylic Turnings", 
"category":"Professional Services", 
"about":"Hand crafted item turned on a wood lath pen pencil bottle stopper cork screw bottle opener perfume applicator or other custom turnings", 
"country":"Canada", 
"state":"NS 
", 
"city":"Middle Sackville"}, 
{"name":"The Hunger Games", 
"category":"Movie 
", 
"about":"THE HUNGER GAMES: MOCKINGJAY - PART 1 - In theatres November 2 2014. www.hungergamesmovie.ca", 
"country":"Added Nothing", 
"state":"Added Nothing", 
"city":"Added Nothing"}, 

합니다. Google-Refine은 여전히 ​​내 파일을 수락하지 않습니까? 내가 잘못하고있는 것은 무엇입니까?

+0

객체는 JSON에 어떤 고유의 순서가 없습니다 만 배열은 않습니다. – Barmar

+0

'cat_list' 값이 유효한 JSON이 아닙니다. 배열은'key : value' 쌍을 포함 할 수 없습니다. 그리고 40,000 줄에서이 값은 배열이 아닌 문자열이며 스키마에 위배됩니다. 당신이 가지고있는 문제는이 문제와 관련이 있다고 생각합니다. 객체의 요소의 순서가 아닙니다. – Barmar

+0

@Barmar가 말했듯이 문제가 관련되지 않을 수도 있습니다. ... 평범한 'json'모듈을 사용하는 경우 dict.items()/dict.iteritems()가 제공하는 순서대로 키를 정렬하기 만하면 정렬하지 않아도됩니다. 삽입 순서를 '기억'하는 collections.OrderedDict를 사용하거나 원하는 순서대로 키를 반환하는 dict 래퍼를 만들 수 있습니다. – Wuggy

답변

0

문제를 해결했는지 확신 할 수 없습니다.

성공적으로 가져 오기 전에 JSON을 유효하게해야합니다. 위의 Q에 게시 한 텍스트가 http://jsonlint.com과 같은 도구로 유효성을 검사하지 못합니다. OpenRefine에 여기에 게시 나는이 성공적으로 JSON을 가져올 수 있습니다

[{"name":"Carstar Bridgewater", 
"category":"Automotive", 
"about":"We are Bridgewaters largest professional collision centre and are committed to being there for customer cars and communities when they need us.", 
"country":"Canada", 
"state":"NS", 
"city":"Bridgewater"}, 
{"name":"Febreze", 
"category":"Product/Service", 
"about":"Freshness that eliminates odorsso you can breathe happy.", 
"country":"Added Nothing", 
"state":"Added Nothing", 
"city":"Added Nothing"}, 
{"name":"Custom Wood & Acrylic Turnings", 
"category":"Professional Services", 
"about":"Hand crafted item turned on a wood lath pen pencil bottle stopper cork screw bottle opener perfume applicator or other custom turnings", 
"country":"Canada", 
"state":"NS", 
"city":"Middle Sackville"}, 
{"name":"The Hunger Games", 
"category":"Movie", 
"about":"THE HUNGER GAMES: MOCKINGJAY - PART 1 - In theatres November 2 2014. www.hungergamesmovie.ca", 
"country":"Added Nothing", 
"state":"Added Nothing", 
"city":"Added Nothing"}] 

:

당신이 OpenRefine (일명 구글 조정)이 가져 오기의 관점에서이 문제는 JSON 객체가 배열에 있어야한다는 것입니다 잘 작동 - 스크린 샷 :

enter image description here enter image description here

+0

정말 이상한데, 내 큰 json 파일을 csv로 변환하는 도구를 작성하기로 결정했지만 답변을주었습니다 :) – Rob

0

"데이터를 Open Refine으로 가져 오면 프로그램은 파일을 읽을 때 비교할 특정 스키마를 묻습니다."

우연히 JSON 또는 심지어 라인보다 XML 형식으로 감지 된 것 같습니다.

그러나 OpenRefine이 추측하려고 시도하거나 때로는 잘못 가져 오는 자동 선택 가져 오기 도구뿐만 아니라 사용하려는 가져 오기 도구 (예 : 선 기반 또는 JSON)를 선택할 수 있습니다. 당신은 여기에 설명 된대로 새 곧 "JSON 라인"또는 "줄 바꿈으로 구분 된 JSON"형식을 처리 할 수처럼 내 눈에

, 그것은 같습니다 http://jsonlines.org/

우리는 JSON 라인을 추가 개방 문제가있는 결국 OpenRefine에 대한 지원 : https://github.com/OpenRefine/OpenRefine/issues/1135

한편, On the Web at the jsonlines.org site 섹션을 살펴보고 필요에 따라 도움을 받으십시오.

+0

안녕 태드, 참조하십시오 내 편집하다. – Rob