2015-02-03 2 views
0

Newtonsoft.Json을 사용하여 테스트 스테이션에서 생성 된 JSON 로그를 구문 분석하려고합니다. 테스트 프로세스로 인해 JSON 컨텐츠가 약간 손상 될 수 있으므로 손상된 데이터를 파싱 할 수 있어야합니다. 더 구체적으로 말하면 파서가 손상되거나 인식 할 수없는 문자를 발견하면 현재 줄을 건너 뛰고 다음 줄에서 구문 분석을 계속하고 싶습니다.Newtonsoft.Json/Json.Net에서 인식 할 수없는 문자를 파싱하는 방법은 무엇입니까?

나는 도서관을 탐험 중이며 아직 해결책을 찾지 못했다. 파서가 멈추는 스 니펫은 다음과 같습니다. 나는 파서와 독립적으로 스트림을 진행하는 것처럼 보이지 않는다.

  • "키를": ""이중 인용 값 ","
  • "키": "불완전 값
  • StringBuilder jsonBuffer = new StringBuilder(); 
    jsonBuffer = "..."; 
    
    StringReader sr = new StringReader(jsonBuffer.ToString()); 
    JsonTextReader jr = new JsonTextReader(sr); 
    jr.SupportMultipleContent = true; 
    bool go = true; 
    while (go) { 
        try { 
         go = jr.Read(); 
        } catch (Exception e) { 
         Console.Write("Oops! JSON Read Exception: "); 
         Console.WriteLine(e.Message); 
         // can't continue past here... 
        } 
    
        if (!go || jr.TokenType == JsonToken.Undefined) break; 
    
        if (jr.Value != null) 
         Console.WriteLine("Token: {0}, Value: {1}", jr.TokenType, jr.Value); 
        else 
         Console.WriteLine("Token: {0}", jr.TokenType); 
    } 
    

    손상의 유형의 몇 가지 예 I 건너 바라고 있어요

  • '누락'또는 '}'와 같은 불완전한 개체

마지막 항목은 중첩 된 개체를 풀기 위해 좀 더 복잡한 논리를 취할 것임을 알고 있지만이 i 1과 2가 반드시 가져야하는 반면에 '좋은 것'이 더 많습니다.

도움을 주시면 감사하겠습니다. 존

+0

이 손상의 모양을 보여줄 수 있습니까? – dbc

+0

물론 게시물에 몇 가지 예를 추가했습니다. –

+0

내용이 줄 바꿈되었다고 가정하면 (JsonTextReader에 의존하는 대신) 구문 분석 외부에서 읽는 내용을 이동하십시오. 기본적으로 : Open File, Read Line, Json.net과 Parse를 계속 진행하십시오. –

답변

0

ms 가정

덕분에 ...

using (StreamReader sr = new StreamReader(ms)) 
{ 
    do 
    { 
     var line = sr.ReadLine(); 
     try 
     { 
      JObject obj = JsonConvert.DeserializeObject(line) as JObject; 
      obj.Dump(); 
      Console.WriteLine("Foo: {0}", obj["foo"]); 
     } 
     catch (JsonReaderException jex) 
     { 
      Console.WriteLine("MALFORMED: {0}", line); 
     } 
    } 
    while (!sr.EndOfStream); 
} 

로그 파일에 STRAM 어느 것 : 각 라인을 읽고

  • 를 읽기위한

    1. 파일 열기 개별적으로 객체 (하는 jobject) 성공
      • 에 선을 구문 분석
      • 시도는, 속성 값 실패시
      • , 쇼 오류 메시지가 덤프
    2. EOF (파일 끝)에 대한 확인
      • EOF가 아닌 경우 2 단계로 돌아갑니다.
      • EOF이면 종료하십시오. 실패를 통해 통과하면서 대부분의 라인을 처리 할

    . catch{} 블록을 수정하여보다 심층적 인 질문을하거나 추후 처리를 위해 사후 로그에 기록 할 수 있습니다.

  • +0

    의미가 있습니다. 좋은 접근법. 나는 그것을 아침에 시도 할 것이다. 도와 주셔서 감사합니다! –

    +0

    시도해보십시오.하지만 여기서 문제는 불완전한 JSON 객체를 발견하면 DeserializeObject가 예외를 throw한다는 것입니다. 예를 들어 : { "foo": "bar"는 쉼표와 열린 중괄호로 인해 실패합니다.이 중괄호는 이전의 합법적 인 JSON 콘텐츠의 일부였습니다. –

    관련 문제