2012-02-13 3 views
0

Я пытаюсь загрузить JSON в базу данных SQL с помощью JSON.net.JSON проблема; deserialising to datatable

У меня не было проблем с другими ответами JSON, однако следующий формат не кажется десериализованным правильно.

{"Report":["2012m01d01","2012m01d02","2012w01","2012m01","2012m01d03","2012m01d04","2012m01d05","2012m01d06","2012m01d07","2012m01d08"], 
"Realtime":null} 

Может ли кто-нибудь дать представление о том, почему это было бы? Я использую следующий код для десериализации.

public void Deserialize(String jsonText, ref DataTable dt) 
     { 
      JsonSerializer json = new JsonSerializer(); 
      json.NullValueHandling = NullValueHandling.Ignore; 
      json.ObjectCreationHandling = ObjectCreationHandling.Replace; 
      json.MissingMemberHandling = MissingMemberHandling.Ignore; 
      json.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 
      StringReader sr = new StringReader(jsonText); 
      JsonTextReader reader = new JsonTextReader(sr); 
      dt = (DataTable)json.Deserialize(reader, typeof(DataTable)); 

      reader.Close(); 
     } 

Любые идеи о том, какой лучший подход к решению этого будет? Это отлично работает с другими ответами JSON!

Заранее спасибо

+3

«следующий формат не выглядит десериализованным правильно», вы получаете какую-либо ошибку или результаты не ожидаются? Какая ошибка и какой результат? Можете ли вы привести пример, где он работает нормально? –

+0

Используете ли вы .NET 4.0, если это так, это ссылка, которая поможет вам и вам. Http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and- dynamic-to-parse-json.aspx – MethodMan

+0

Это не вызывает ошибок. Это просто не похоже на десериализацию. Тем не менее, следующие десериализуются. [{ "ACCOUNTID": 1, "ProfileID": нулевой, "имя": "Страницы", "ID": "18d039ae0360", "язык": нулевой, "тип": нулевой, "Категория": нулевой, "IsHierarchy ": false," IntervalsEnabled ": true," IsRealtimeCompatible ": true," properties ": null}, (и так далее) – user1207242

ответ

0

JSON имеет возможность держать hirarchial информации, которая не переводить в один DataTable, а в несколько использовании набора данных, и таблицу отношений.

Я положил свой JSON в http://jsonlint.com валидатор и форматировщиком

вы говорите, десериализует без проблем

{ 
    "accountID": 1, 
    "profileID": null, 
    "name": "Pages", 
    "ID": "18d039ae0360", 
    "language": n‌​ull, 
    "type": null, 
    "Category": null, 
    "IsHierarchy": false, 
    "IntervalsEnabled": true, 
    "IsRe‌​altimeCompatible": true, 
    "properties": null 
} 

это единственный объект

, но это не десериализации правильно.

{ 
    "Report": [ 
     "2012m01d01", 
     "2012m01d02", 
     "2012w01", 
     "2012m01", 
     "2012m01d03", 
     "2012m01d04", 
     "2012m01d05", 
     "2012m01d06", 
     "2012m01d07", 
     "2012m01d08" 
    ], 
    "Realtime": null 
} 

На самом деле ваша проблема обработка данных не serializion

первый является единым объектом и может быть десериализаций в DataTable , а другой объект, который содержит ссылку на список объектов отчета.

поэтому вам нужно вручную написать конвертер из вашего объекта до двух DataTables

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

  var settings = new JsonSerializerSettings 
     { 

      MissingMemberHandling = MissingMemberHandling.Error, 
      NullValueHandling = NullValueHandling.Include 

     }; 
     JsonSerializer json = JsonSerializer.Create(settings); 

     json.Error += (x, y) => 
     { 
      var s = y.ErrorContext; 
      var t = y.CurrentObject; 

     }; 

     StringReader sr = new StringReader(jsonString); 
     JsonTextReader reader = new JsonTextReader(sr); 


     var o = json.Deserialize<ClsReport>(reader); 

     string sf = o.ReportItems[2]; 

Надежда это помогает

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