>  기사  >  백엔드 개발  >  json.Unmarshal 파일 데이터는 유효하지만 json.NewDecoder().Decode()는 유효하지 않습니다.

json.Unmarshal 파일 데이터는 유효하지만 json.NewDecoder().Decode()는 유효하지 않습니다.

WBOY
WBOY앞으로
2024-02-09 12:15:31819검색

json.Unmarshal 文件数据有效,但 json.NewDecoder().Decode() 无效

php 편집기 Strawberry는 JSON 구문 분석에 대한 문제를 소개합니다. 때때로 우리는 json.Unmarshal을 사용하여 파일 데이터를 구문 분석하는 것이 효과적이지만 json.NewDecoder().Decode()를 사용하는 것이 효과적이지 않은 상황에 직면합니다. 이 문제는 코드 로직이나 데이터 형식에서 발생할 수 있습니다. 아래에서는 가능한 원인을 자세히 분석하고 해결 방법을 제공합니다.

질문 내용

다음은 구조를 올바르게 역마샬링합니다.

으아악

그러나 이것은 작동하지 않으며 고전적인 JSON 구문 분석 오류 eofunexpected token 't' 등이 많이 발생합니다.

으아악

이유를 아시나요? os.file[]byte 두 개의 고루틴에서 동시에 사용되는 json 구조는 다음과 같습니다(일부 필드는 생략됨):

func foo() {
  d, err := os.readfile("file.json")

  var t t
  if err := json.unmarshal(d, &t); err != nil {
    panic(err)
  }
}

Solution

os.File[]byte 두 개의 고루틴을 동시에 사용하세요...

그게 문제야. os.File 다음 읽기가 발생하는 내부 파일 포인터가 있습니다. 관련되지 않은 두 엔터티가 계속해서 데이터를 읽는 경우 겹치는 데이터를 읽지 못할 수 있습니다. 첫 번째 엔터티에서 읽은 바이트는 두 번째 엔터티에서 반복되지 않습니다.

게다가 os.File은 동시 사용에 안전하지 않습니다(문서에는 안전하다고 명시적으로 명시되어 있지 않습니다). 여러 동시 고루틴에서 해당 메서드를 호출하면 데이터 경합이 발생할 수 있습니다.

"읽는" 여러 함수/고루틴에 []byte를 전달하면 공유 포인터나 인덱스 변수가 없습니다. 각 함수/고루틴은 인덱스를 별도로 유지하며 여러 고루틴(이 경우 슬라이스 헤더 및 슬라이스 요소의 필드)에서 변수를 읽어도 괜찮습니다.

위 내용은 json.Unmarshal 파일 데이터는 유효하지만 json.NewDecoder().Decode()는 유효하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제