전체 개체를 로드하지 않고 JSON 스트림 마샬링
목표는 전체 스트림을 메모리에 보관하지 않고 대규모 데이터 스트림을 인코딩하는 것입니다. JSON은 일반적인 데이터 형식이지만 표준 라이브러리의 json.Marshaler 인터페이스는 이를 달성하는 간단한 방법을 제공하지 않습니다.
사용자 정의 문자열 작성
현재 내장 기능이 부족하다는 점을 고려하면 합리적인 접근 방식인 WriteString을 사용하여 JSON 문자열을 수동으로 생성합니다. 이 방법을 사용하면 한 번에 작은 양의 데이터만 처리할 수 있습니다.
encoding/json 수정
encoding/json 패키지를 수정하려는 경우 채널을 배열로 처리하기 위해 ReflectValueQuoted 함수를 패치할 수 있습니다. 이렇게 하면 전체 스트림을 버퍼링하지 않고도 채널을 탐색하고 해당 값을 사용할 수 있을 때 인코딩할 수 있습니다.
코드 패치 예
다음은 인코딩/의 수정된 버전입니다. 사용할 수 있는 json 코드:
<code class="go">// Inside switch: case reflect.Chan: e.WriteByte('[') i := 0 for { x, ok := v.Recv() if !ok { break } if i > 0 { e.WriteByte(',') } e.reflectValue(x) i++ } e.WriteByte(']')</code>
결론
전체 데이터를 로드하지 않고 JSON 스트림을 마샬링하는 유일한 현재 옵션은 문자열을 수동으로 구성하는 것입니다. 현재 인코딩/json 패키지를 수행 중이거나 수정하고 있습니다. 패키지를 수정하려면 내부 구현에 대한 지식이 필요하므로 신중하게 고려해야 합니다.
위 내용은 메모리에 전체 개체를 로드하지 않고 JSON 스트림을 마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!