2012-02-17 3 views
2

UTF16으로 인코딩 된 JSON 파일을 구문 분석하려고하는데 이상한 문제가 발생했습니다.InputStreamReader, FileInputStream이 파일 시작을 중간 대신 시작합니다.

FileInputStream을 사용할 때마다 파일 구문 분석이 중간 지점부터 시작되는 것 같습니다. 예를 들어, 파일의 길이가 40 자이면 문자 20에서 시작합니다. JSON을 구문 분석 할 때 오류가 발생합니다. 분명히 데이터가 파일의 문자 0에서 시작됩니다.

몇 주 동안 일 했음에도 불구하고이 문제는 요즘 날카롭게되었습니다. 문제가 시작될 때까지 변경되지 않았기 때문에 코드에 아무런 문제가 없음을 알 수 있습니다.

내 시도 된 해결 방법 중 하나는 FileReader을 사용하는 것으로 전환하는 것입니다. 일반적으로 문자 0에서 시작되지만 문서에서 UTF-16 문자를 처리 할 수는 없으므로 문제가 해결되지 않습니다.

Google의 Gson 라이브러리를 사용하여 JSON을 처리하지만이 문제는 InputStreamReader 또는 FileInputStream에있는 것으로 생각됩니다.

아래는 문제가되는 코드입니다.

JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(file), "UTF-16")); 
reader.beginArray(); 
... 

여기에 오류가 있습니다. 위의 reader.beginArray(); 줄은 예외입니다.

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 21 
    at com.google.gson.stream.JsonReader.expect(JsonReader.java:337) 
    at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:304) 
    at reader.ProofDatabase.load(ProofDatabase.java:130) 
    ... 

그리고 여기가, UTF16 문자열

JsonReader reader = new JsonReader(new FileReader(file)); 
reader.beginArray(); 
... 

모든 솔루션을 처리 그것을 원래의 문제에 대한 수정, 또는 UTF16으로 파일에 읽기의 다른 방법을하지 않는 내 부분적인 해결 방법입니다 환영받을 것이 아닌가.

+0

JSON 파일이 Byte Order Marker로 시작합니까? 어떻게 생성됩니까? – Joni

+0

현재 사용중인 파일은 직접 작성되었습니다. 수동으로 올바른 json을 입력 한 것처럼. 이전 파일은 gson 라이브러리의'JsonWriter' 클래스를 사용하여 생성되었습니다. –

+0

어떤 편집기를 사용하셨습니까? – Joni

답변

0

해결책을 찾은 후 질문을 업데이트하지 마십시오.

오류는 프로그래밍 방식으로 생성하지 않고 수동으로 JSON 파일을 만든 사실에서 비롯된 것입니다.

파일이 JSONWriter 클래스에 의해 생성 된 경우 파서에 JSON 파일임을 알리는 파일에 추가 메타 데이터가 추가되었습니다. 수동으로 생성 된 파일에서이 메타 데이터가 누락되어 JSONReader가 파일 구문 분석에 오류를 발생시키고있었습니다.

관련 문제