2016-08-11 2 views
1

몇 가지 JSON 데이터 파일을 받았지만 각 객체에 BSON 데이터 유형이 포함되어 있습니다. 그것의 꼭대기에, 그것의 정말로 큰 tojson 덤프 (기록의 수백만).bson 데이터 유형을 포함하는 mongodb에 의해 생성 된 Deserialize json

데이터를 deserialize하려고하는데 예상대로 실패합니다.

는 Json.net으로이 문제를 해결할 수있는 방법이 있나요 ...

"someKey" : NumberLong("1234567889"), 

또한 거기에 ISODate 있습니다

JSON 파일은 같은 것들을 가지고? 특정 키에 대한 내장 파서가 아닌 사용자 정의 함수를 사용하도록 설정 한 것 같습니다.

*

당신은 몽고 드라이버 bson 시리얼 사용할 수 있습니다

using (StreamReader file = File.OpenText(@"\\largedump.txt")) 
      using (JsonTextReader reader = new JsonTextReader(file)) 
      { 
       reader.SupportMultipleContent = true;  
       var serializer = new JsonSerializer(); 
       while (reader.Read()) 
       { 
        if (reader.TokenType == JsonToken.StartObject) 
        { 
         Contacts c = serializer.Deserialize<Contacts>(reader); 
         Console.WriteLine(c.orgId); 
        } 
       } 
      } 
+0

'{ "someKey"NumberLong으로 ("1234567889")}'유효 JSON 아니다. [JSON 표준] (http://www.json.org/)을 참조하십시오. 즉, Json.NET은 [생성자] (https://stackoverflow.com/questions/36958680)를 포함하여 표준에 대한 일부 확장을 지원합니다. JSON을'{ "someKey": new NumberLong ("1234567889")}'로 사전 처리 할 수 ​​있다면 Json.NET – dbc

+0

으로 구문 분석 할 수 있습니다. DBA가 strict로 덤프하지 않아 유효하지 않습니다. 그것은 내가 이미 코드화 한 '$ numberlong'을 가진 json에서 그것을 표현 했으므로 더 좋았을 것입니다. 그리고 이제 조정해야합니다. ID와 같은 것 같아요 사전 처리하기 위해 독자로부터 문자열을 캡처해야 ... – zxed

+0

나는'NumberLong' 전에'new'를 삽입하기 위해 정규 표현식을 사용해야 할 수도 있습니다 (아니면 그냥 완전히 제거합니다). 결과를 임시 파일로 스트리밍합니다. – dbc

답변

0

매우 큰위한 스트림 + TextReader를위한 코드 (100기가바이트 + 파일)을 포함하도록 업데이트 : MongoDB.Bson.Serialization를 사용

을;

var bjson = @"{ 
         '_id' : ObjectId('57ac672e34780e59784d7d2a'), 
         'ActivePick' : null, 
         'EventCodeId' : null, 
         'Frame' : { '$binary' : 'AgY=', '$type' : '00' }, 
         'FrameTimeStamp' : ISODate('2016-08-11T11:53:18.541Z'), 
         'ServerUserId' : 0, 
         'ServerUserName' : null, 
         'SesionId' : 0, 
         'TraderId' : null, 
         'TraderName' : null 
        }"; 

     var bsonDocument = BsonDocument.Parse(bjson); 
     var myObj = BsonSerializer.Deserialize<FrameDocument>(bsonDocument); 

소스 here

편집

나는 주어진 접근 방식에는 문제가 없었다. 문제없이 직렬화되므로 github 솔루션을 참조하십시오.

  string line; 
      using (TextReader file = File.OpenText("ImportDataFromBJsonFile\\a.json")) 
      { 
       while ((line = file.ReadLine()) != null) 
       { 
        var bsonDocument = BsonDocument.Parse(line); 
        var myObj = BsonSerializer.Deserialize<Zxed>(bsonDocument); 
       } 
      } 

source (sln project)

+0

스트림 리더와 함께 사용할 수 있습니까? – zxed

+0

우리는 streamRedar에서 제공하는 문자열을 입력해야하므로 여기에는 아무런 문제가 없습니다. – profesor79

+0

나는 그렇게 간단하지 않다고 생각한다 - 32GB 수출 파일; 100,000,000 개의 레코드; 당신은 간단한 streamreader를 사용할 수 없기 때문에 각 json 토큰 (레코드)의 시작과 끝을 찾을 수 있도록 jsontextreader 여야합니다. 동일한 작업을 수행하는 jsontextreader에 대한 대안을 알고 있다면 친절하게도 솔루션을 업데이트 할 수 있습니까? – zxed