2016-08-11 2 views
1

Я получил несколько файлов данных JSON, однако он имеет типы данных BSON, включенные в каждый объект; Кроме того, это действительно большой дамп tojson (миллионы записей).Deserialize json, созданный mongodb, который содержит bson datatypes

Я пытаюсь десериализовать данные и, как ожидалось, не удается.

Файл JSON имеет такие вещи, как:

"someKey" : NumberLong("1234567889"), 

Он также имеет ISODate там ...

Есть ли способ справиться с этим с Json.NET? Похоже, что есть некоторые настройки, чтобы использовать пользовательскую функцию, а не встроенный парсер для определенных ключей?

* Обновленный, чтобы включать код для потока + TextReader для очень больших (100GB + файл)

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

Yup - его недействительным, поскольку DBA не сбрасывали его со строгим; что было бы лучше, поскольку это представило бы его в json с «$ numberlong», который я уже закодировал для ... и теперь должен корректироваться. Кажется, что id должен захватить строку из читателя, чтобы предварительно обработать его ... – zxed

+0

Думаю, вам может понадобиться какое-то Regex, чтобы вставить 'new' перед' NumberLong' (или просто удалить его полностью), потоковая передача результата в файл temp. – 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 записей; вы не можете использовать простой streamreader, он должен быть jsontextreader, чтобы он мог найти начало и конец каждого токена json (запись). Не могли бы вы любезно обновить свое решение, если знаете альтернативу jsontextreader, который делает то же самое? – zxed

Смежные вопросы