ProgramingTip

JSON 텍스트는 최소한 두 개의 옥텟을 포함해야합니다.

bestdevel 2020. 11. 25. 08:15
반응형

JSON 텍스트는 최소한 두 개의 옥텟을 포함해야합니다.


이 오류를 수리 할 것이라고 생각했습니다.

이 스 니펫을 irb에서 실행하는 경우 :

JSON.parse( nil )

다음 오류가 표시됩니다.

TypeError: can't convert nil into String

나는 함수가 nil아닌 TypeError. 를 사용하여 모든 입력을 변환 to_s하면 옥텟 오류가 표시됩니다.

JSON::ParserError: A JSON text must at least contain two octets!

그건 괜찮아요. 옥텟이 무엇인지 모르는 경우 요약 및 솔루션을 위해 존재를 발견했습니다 . JSON 옥텟은 무엇이며 왜 두 개가 필요한가요?

해결책

전달하는 변수는 빈 노드입니다. 메소드 JSON.parse빈 곳을 사용하지 않습니다 .

질문

이제 오류의 원인을 알았습니다.이를 처리하기 위해 어떤 패턴을 가지고 있습니까? nil을 허용하기 위해 JSON 라이브러리를 원숭이 패치하는 것을 약간 싫어 합니다. 어떤 제안도 대단히 감사하겠습니다.


parsed = json && json.length >= 2 ? JSON.parse(json) : nil

그러나 실제로 라이브러리는 처리하고 nil을 반환해야합니다. JSON 지원이 내장 된 웹 브라우저는 결국 예상대로 작동하는 것입니다.


또는 약간만 방해되는 미니 패치로 수행 비용 :

module JSON
  def self.parse_nil(json)
    JSON.parse(json) if json && json.length >= 2
  end
end

parsed = JSON.parse_nil(json)

data.presence && JSON.parse(data)

JSON.parse(data.presence || '{}')

json.org 에 따르면

JSON은 두 가지 구조로 구축됩니다.

  1. 이름 / 값 쌍의 모음입니다. 다양한 언어에서 배열 배열, 레코드, 배열, 사전, 해시 테이블, 키순 목록 또는 연관로 실현됩니다.

  2. 정렬 된 값 목록입니다. 대부분의 언어에서 배열, 벡터, 목록 또는 시퀀스로 실현됩니다.

최소한 최상위 수준에서 필요한 최소 2 개의 옥텟 (8 비트)은 {}또는[]

IMO에서 가장 좋은 해결책은 인수 JSON.parse가 strigified 또는 strigified 배열인지 확인하는 것입니다. :-)


hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''

참고 URL : https://stackoverflow.com/questions/8390256/a-json-text-must-at-least-contain-two-octets

반응형