2013-02-21 2 views
10

키나 값을 따옴표없이 인용 부호로 묶은 JSON 문자열이 있는데 정확한 형식의 JSON으로 변환하고 싶습니다.따옴표로 묶지 않은 JSON 문자열을 구문 분석하는 방법

{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}} 

처리 할 수있는 Java 라이브러리가 있습니까? 나는 Jackson을 시도했지만 작동하지 않습니다.

관련, 월

답변

4

당신은 인용 부호로 둘러싸이지 않은 필드 이름을 허용 잭슨 JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES을 사용할 수 있습니다 : 당신은 당신이 파서 여부를 자신의 기록에 주변에 도착하지만 그랬다면

JsonFactory factory = new JsonFactory(); 
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json")); 
+2

인용 부호가없는 값이나 따옴표가없는 숫자 키 (예 : "0 : myValue")에 대해서는 도움이되지 않습니다. – Jan

+1

"라이센스"의 경우 : "1, 2"는 라이센스가 잘못되었습니다 : 1, 2 '어떻게 해석을 선택 하시겠습니까? 나는 당신이 당신 자신의 비 직렬 기 (deserializer)를 써야 할 것이라고 생각한다. Jackson의'ObjectMapper'와'Module' 기능이 도움이 될 것입니다. – ipavlic

+0

필자의 경우, ','이없는 문자열 만 값으로 사용한다는 것을 알고 있습니다. 하지만 네, 내 파서를 써야 할 것 같습니다. – Jan

0

확실하지.

{ 
    basic: 
    { 
     0: 
     { 
     index: 0, 
     license: t, 
     nameSID: n, 
     image: img_left, 
     descriptionSID: t, 
     category: r 
     } 
    } 
} 

img_left 
0

내가 하나가 잭슨이 처리하는 사용자 정의에 대해 이동하는 방법으로 보았다 : 여기

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의 생성자로 전달 될 수 있습니다.

희망이 있으면 도움이됩니다.

관련 문제