2016-08-11 7 views
1

いくつかのJSONデータファイルを受け取ったが、各オブジェクトにはBSONデータ型が含まれていた。その上には、本当に大きなトジソンダンプ(数百万のレコード)があります。bsonデータ型を含むmongodbによって生成されたjsonをデシリアライズ

データを逆シリアル化しようとしていますが、期待通りに失敗します。

はJson.netでこれを処理する方法はあります...

"someKey" : NumberLong("1234567889"), 

また、そこにISODateがあります

JSONファイルには、のようなものを持っていますか?特定のキー用の組み込みパーサーではなく、カスタム関数を使用するように設定するのはおそらくいくつかの設定があるようですね。

*非常に大きい(100ギガバイト+ファイル)のためのストリーム+たTextReaderのコードを含むように更新

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が厳密にダンプしなかったため無効です。これは、すでにコード化されていた「$ numberlong」を使ってjsonで表現したように優れていましたが、今調整する必要があります。 idのように見えるので、それを前処理するために読者からの文字列をキャプチャする必要があります... – zxed

+0

'NumberLong'の前に' new'を挿入するためにRegexを使う必要があるかもしれないと思います。結果を一時ファイルにストリーミングする。 – dbc

答えて

0

あなたはモンゴドライバBSON・シリアライザ使用することができます。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

EDIT

私は与えられたアプローチでは問題がなかったです。問題なしでシリアライズしているので、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

私はそのように単純だとは思わない - 32ギガバイトのエクスポートファイル。 100,000,000レコード。シンプルなストリームリーダーを使用することはできません。各jsonトークン(レコード)の開始点と終了点を見つけることができるように、jsontextreaderである必要があります。同じことをするjsontextreaderの代替を知っていれば、あなたのソリューションを親切に更新できますか? – zxed

関連する問題