JSON에서 데이터 테이블로 : NULL 열이 자동으로 삭제되는 것을 방지하는 방법은 무엇입니까?안녕하세요,
저는 JMP 15를 사용하고 있으며 Http Request ()를 통해 JSON 페이로드를 검색하고 Char를 통해 Blob ()으로 실행 한 다음 데이터 테이블에서 open ()하는 JSL이 있습니다. JSON 페이로드 콘텐츠는 동적이지만 항상 테이블 형식 (행 및 열)에 매핑 할 수 있습니다.
문제 : JSON의 키에 모든 NULL 값이있는 경우 데이터 테이블에 포함되지 않습니다 (즉, 이러한 키에 대한 열이 생성되지 않음). 모든 값이 NULL이든 아니든 JSON의 모든 키가 데이터 테이블의 열로 표시되기를 원하기 때문에 이것은 문제가됩니다.
페이로드를 로컬 파일에 저장하고 Open ()을 사용하여 직접 열면 원하는 결과를 얻습니다. 모든 키가 열로 변환되고 모든 NULL 값이 NULL로 표시되는 데이터 테이블입니다. 그러나 이것은 내 사용 사례에서 작동하지 않습니다.
다음은 문제를 재현하는 기본 JSL입니다. Http Request () 대신 동일한 결과를 제공하는 Load Text File ()을 사용하여 데이터를 검색합니다. "data.json"파일이 첨부됩니다.
dt1 = Open("/Users/abc/data.json", JSON ); // works as desired
raw = Load Text File("/Users/abc/data.json");
jsonblob = Char To Blob( raw );
dt2 = open(jsonblob, "JSON", Guess("wide")); // does not work as desired -- drops all-NULL columns누구든지 변수의 JSON을 모두 NULL 키를 유지하는 데이터 테이블로 변환하는 방법을 제안 할 수 있습니까?
감사!
앤디
스크립팅Re : JSON에서 데이터 테이블로 : NULL 열이 자동으로 삭제되는 것을 방지하는 방법은 무엇입니까?도움이 될만한 답변을 아래에 썼는데 먼저 시도해야 할 간단한 답변이 있다는 것을 깨달았습니다. 데이터가 pandas 형식 중 하나 인 것 같으므로 "wide"를 "pandas"로 변경하십시오.
그것이 잘못된 것으로 판명되면 시도하십시오 ...
마법사를 사용하여 명시 적으로 열을 선택한 다음 해당 스크립트를 사용합니다.
스택 옵션도 원할 것입니다.
또한 행 생성기를 루트에서 항목으로 변경했습니다. 조금 더 정확하기 때문입니다. 아마도 실제 차이를 만들지 않을 것입니다.
행에 대해 선택된 항목은 해당 항목이 발생할 때마다 데이터 테이블에 새 행이 기록되도록합니다. 통계를 켜면 항목이 2 번 반복되는 것을 볼 수 있습니다.
Re : JSON에서 데이터 테이블로 : NULL 열이 자동으로 삭제되는 것을 방지하는 방법은 무엇입니까?제안 해 주셔서 감사합니다, Craige. 나는 그들을 시도하고 몇 가지 후속 질문이 있습니다.
1. Guess를 "wide"에서 "pandas"로 변경하면 데이터 테이블에 NULL 열이 성공적으로 포함됩니다. 불행히도 새로운 문제가 발생합니다. JSON 데이터의 마지막 "행"이 데이터 테이블의 모든 행에 대해 반복됩니다 ( 첨부 된 "pandas.png"참조-Lot Number 21055는 두 번 반복되며 Lot Number 21054는 포함되지 않습니다. 더 큰 데이터 세트로 동일한 동작을 복제했습니다.)
이 문제를 해결할 수있는 다른 Open () 매개 변수 또는 구성이 있습니까?
2. 마법사를 사용하여 NULL 열을 포함한 data.json 파일을 성공적으로 가져올 수 있었지만 생성 된 스크립트는 data.json의 페이로드에 고유합니다 (첨부 된 "script_view.png"참조). 내 사용 사례는 더 일반적입니다. JSL이 수신하는 페이로드는 열 수와 열 레이블이 다릅니다. 마법사의 출력을 사용하여보다 일반적인 구성 옵션을 만드는 방법이 있습니까? 아니면 페이로드를 수동으로 반복하고 데이터 테이블을 열 단위로 구성하는 유일한 옵션입니까?
2b. 이와 관련하여 Open ()과 함께 "JSON 설정"매개 변수를 사용하기위한 문서를 알려줄 수 있습니까? 구문 참조 또는 스크립팅 색인에서 아무것도 찾을 수 없습니다 (그리고 'JMP JSL "JSON 설정"'을 google 검색 할 때 가장 인기있는 것은이 포럼의 이전 질문입니다).
3. Open ()이 빈 열을 숫자로 가져 오도록 강제하는 방법이 있습니까? Import Settings에서 "Treat Empty Columns as Numeric (1)"을 시도한 결과 data.json 파일이 한 줄 / 레코드 (첨부 된 "pandas_numeric.png 참조)로 처리되었습니다."라고 가정합니다. 뭔가 잘못되었습니다.
감사!
앤디
Re : JSON에서 데이터 테이블로 : NULL 열이 자동으로 삭제되는 것을 방지하는 방법은 무엇입니까?- 좋아, 와이드 옵션이 올바른 옵션이라고 생각하며 모든 누락 된 열이 가져 오기에서 제거되는 버그입니다.안녕하세요. 그것은 확실히 일을 복잡하게 만듭니다.
- 가능한 모든 열을 알고 있고 하위 집합 만 JSON에 포함되는 경우 JSON 설정에 모든 열을 나열 할 수 있습니다. 먼저 작은 테스트를 수행하고 필요한 방식으로 작동하는지 확인합니다 (전체 열 집합을 얻을 수 있는지 아니면 JSON에 나타나는 하위 집합 만 얻을 수 있는지 잘 모르겠습니다.)
- 이전 버전의 JSON 가져 오기 코드에 계속 액세스 할 수 있습니다. JSON을 지정하면 (JSON 설정없이) 원하는 작업을 수행 할 수 있습니다.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- JSON은 pandas 형식과 똑같이 보이지 않습니다. 그러나 pandas 옵션은 원하는 열 이름을 검색하는 것 같습니다. 아무것도 작동하지 않으면 실제로 데이터를 가져 오기 위해 두 번째 가져 오기를 위해 즉시 JSON 설정을 만드는 시작점이 될 수 있습니다.
- 내가 알고있는 JSON 설정에 대한 특정 문서는 없습니다. 마법사에 의해 작성되었으며 여전히 사람이 읽을 수 있습니다. 마법사 대화 상자 값과 일치하며 거기에 문서가 있습니다.
- ImportOptions가 CSV 가져 오기에 사용되는 것으로 확신합니다. JSON 마법사에서는 사용되지 않습니다.
Re : JSON에서 데이터 테이블로 : NULL 열이 자동으로 삭제되는 것을 방지하는 방법은 무엇입니까?그리고 json의 소스를 제어 할 수 있고 실제 팬더 형식으로 가져올 수 있다면
orient='table' (in python code)
좋은 선택이 될 수 있습니다. JMP 가져 오기는 해당 메타 데이터 중 일부를 사용할 수 있습니다. JMP는 다른 방향도 읽을 수 있습니다.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Re : JSON에서 데이터 테이블로 : NULL 열이 자동으로 삭제되는 것을 방지하는 방법은 무엇입니까?메모 감사합니다. 안녕하세요. .나는 JMP의 향후 릴리스에서 고려할 수 있도록 글 머리 기호 1에 언급 된 결함을 개발 팀에보고했습니다.
그만한 가치는 JMP 14.3에서 null 열을 삭제하지 않는 것 같습니다.
raw = Load Text File( "$DOWNLOADS/data.json" );
jsonblob = Char To Blob( raw );
dt2 = Open( jsonblob, "JSON", Guess( "wide" ) );
JSON To Data Table( raw, Guess( "wide" ) );
Re : JSON에서 데이터 테이블로 : NULL 열이 자동으로 삭제되는 것을 방지하는 방법은 무엇입니까?요소가없는 JSON 배열은 JMP에 문제가 있습니다.한 가지 옵션은 빈 배열을 하나 이상의 자식이있는 배열로 바꾸는 것입니다.해당 자식을 null로 만들거나 누락 된 값 문자-[.]를 사용할 수 있습니다.이것은 더 이상 유효한 JSON이 없다는 것을 의미한다고 생각하지만 JMP 16은 여전히 그것을 읽을 것이며 현재로서는 그 동작을 깰 계획이 없습니다.null을 사용하면 문자 열이 생성되고 누락 된 값을 사용하면 숫자 열이 생성됩니다.JSON에 []가 포함 된 문자열 데이터가 없다는 것을 알고 있다면 간단히 이렇게 변경할 수 있습니다.
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
JSON 문자열에서 []를 대체하지 않도록 보호하려면 문자열을 건너 뛰는 데 몇 줄의 jsl이 더 필요하지만 여전히 너무 어렵지는 않습니다.