내가 하나가 잭슨이 처리하는 사용자 정의에 대해 이동하는 방법으로 보았다 : 여기
String str = "{basic:{0:{index:0, license:t, nameSID:n, image:\"img_left\", descriptionSID:t, category:r}}";
Map<String, Object> jso = Json.parseJSON(str);
System.out.println(jso);
System.out.println(Json.get(jso, "basic", "0", "image"));
이 출력됩니다 : 여기
https://github.com/ischumacher/rsjp
은 예와 JSON 사용 예이다 따옴표로 묶지 않은 입력란 값 (입력란 이름 대비) 비록 내가 대신 해킹을 작성했지만, 다른 사람들을 위해 여기에 빵 부스러기 흔적을 게시하고 있습니다. 내 코드 spelunking은 Jackson 2.7.2에서 수행되었습니다.
잭슨 코어가 JsonParser 인터페이스의 두 가지 구체적인 구현 제공 :
- ReaderBasedJsonParser 문자 스트림 파서 (독립 부호화 )
- UTF8StreamJsonParser, UTF-8 바이트에 최적화 파서
스트림
이 두 클래스의 코드는 매우 중복되어있어 필요에 따라 작성됩니다. 각 클래스에는 예기치 않은 문자가 발생했을 때 nextToken()에 의해 호출되는 메서드가 있습니다. ReaderBasedJsonParser의 이름은 _handleOddValue()이고 UTF8StreamJsonParser의 _handleUnexpectedValue()입니다. "NaN"을 숫자 값으로 받아들이고 여기에 작은 따옴표로 묶은 문자열 값을 허용하는 것과 같은 것들.
내 계획 (내가 내 감각에 와서 끔찍한 해킹이 내 단기적인 요구에 충분할 것이라는 것을 깨닫기 전에)이 파서 중 하나 또는 둘 모두를 서브 클래스 화하고 위의 메서드를 무시하고 따옴표로 묶지 않은 문자열 값을 처리했다. 이 메소드는 입력 스트림이 필드 값의 문맥 (콜론을 인식 한 직후)에있을 때 호출되기 때문에 쉼표 나 오른쪽 중괄호가 나타날 때까지 앞으로 읽는 것이 가능해야합니다. 캐릭터 라인 치 이 코드는 잭슨의 버퍼링 전략, 파서의 아키텍처 (현재 버퍼로의 현재 포인터가 인스턴스 변수) 등을 이해해야하므로 작성하기가 까다 롭습니다. ObjectMapper가이 사용자 정의 파서를 사용하도록 만들려면 다음을 수행해야합니다. JsonFactory를 서브 클래스 화하고 _createParser() 메소드를 인스턴스화하는 메소드로 대체하십시오. 성능이 중요하지 않은 경우 일반 파서를 강제로 사용하는 것으로 충분하지만 일반 및 UTF-8 파서가 올바르게 작동하려면 더 많은 작업이 필요할 수 있습니다. 그런 다음이 사용자 정의 JsonFactory의 인스턴스가 ObjectMapper의 생성자로 전달 될 수 있습니다.
희망이 있으면 도움이됩니다.
인용 부호가없는 값이나 따옴표가없는 숫자 키 (예 : "0 : myValue")에 대해서는 도움이되지 않습니다. – Jan
"라이센스"의 경우 : "1, 2"는 라이센스가 잘못되었습니다 : 1, 2 '어떻게 해석을 선택 하시겠습니까? 나는 당신이 당신 자신의 비 직렬 기 (deserializer)를 써야 할 것이라고 생각한다. Jackson의'ObjectMapper'와'Module' 기능이 도움이 될 것입니다. – ipavlic
필자의 경우, ','이없는 문자열 만 값으로 사용한다는 것을 알고 있습니다. 하지만 네, 내 파서를 써야 할 것 같습니다. – Jan