2012-12-12 85 views
1

我想解析一個json文件,然後對其進行操作以將數據插入SQL Server 2008數據庫。解析大json

例子:

var sr = new StreamReader("C:\\path to file\file.json"); 
var json = JsonSerializer.SerializeToString(sr); 
var o = JsonObject.Parse(json); 

但我總是在第二條線這個錯誤 - 「超時不支持此流。」

JSON文件看起來是這樣的:

"main":{ 
    "prg": [ 
       { 
        "Id": 1, 
        "name": "A&E", 
        more fields 
       } 
    "prg": [ 
       { 
        "Id": 2, 
        "name": "asda", 
        more fields 
       } 
} 

我需要做這樣的事情

foreach (prg in main) 
    entity.id = prg.id 
    entity.name = prg.name 

我怎麼能做到這一點,爲什麼我得到超時異常?

編輯:爲了更好地理解我的問題,這是我如何爲一個XML文件

XmlDocument sourceDoc = new XmlDocument(); 
sourceDoc.Load(SourcesElement2); // where SourcesElement2 is the path to my XML 
XmlNodeList prg = sourceDoc.GetElementsByTagName("prg"); 

foreach (XmlNode item in prg) 
{ 
    entity.Name= item.SelectSingleNode("name").InnerText; 
    ... 
} 

我已經轉換了XML爲JSON做,我想做同樣的事情。對於JSON文件中每一個「PRG」節點在數據庫中插入一個新的項目

EDIT2:

這是我做了什麼。

using (
      StreamReader stream = 
       File.OpenText(
        "C:\\path\\Sources.json") 
      ) 
     { 
      JObject sources = (JObject) JToken.ReadFrom(new JsonTextReader(stream)); 

      var a = sources["on"]; 
      var b = a["sources"]; 
      var c = b["prgs"]; 
      foreach (var item in c) 
      { 
       var d= item.SelectToken("prg"); 

       // Here d is null 

      } 

我有同樣的問題,從上面的一個。對於Json文件中的每個「prg」節點,都會在數據庫中插入一個新項目。我怎樣才能做到這一點 ? (路徑prg是/ sources/prgs /)

+0

你的問題是什麼? –

+0

對不起。我編輯了這個問題。 – Kosmog

回答

2

爲大家在這裏同樣的問題是我做了什麼(注:這只是一個例子)

順便說一句,謝謝大家誰試圖回答我的問題,我很抱歉的我的錯。

 List<string> d = new List<string>(); 

     using (
      StreamReader stream = 
       File.OpenText(
        "C:\\path\\Sources.json") 
      ) 
     { 
      JObject sources = (JObject) JToken.ReadFrom(new JsonTextReader(stream)); 

      var a = sources["on"]; 
      var b = a["sources"]; 
      var c = b["prgs"]; 
      foreach (JObject item in c["prg"].ToList()) 
      { 
       d.Add(item.Value<string>("name")); 
      } 

     } 

     //part below is just for testing 
     foreach (var VARIABLE in d) 
     { 
      Console.WriteLine(VARIABLE); 
     } 
     Console.ReadLine(); 
+1

而不是使用多個變量,你可以這樣寫:sources [「on」] [「sources」] [「prgs」] [「prg」]。ToList() – Kosmog

3

我不認爲你想要序列化的流。

JsonSerializer.SerializeToString(sr)

你想反序列化從流。

JsonSerializer.Deserialize

您可能需要使用JsonReader出於性能的考慮。

您的XML示例將整個文件加載到內存中 - 您不希望爲大文檔執行此操作。 reader.Read()模式更適合處理大文件。

+0

謝謝。我這樣做:JsonReader reader = new JsonTextReader(sr);但是我怎麼能夠在我的問題中談論我所說的那些? – Kosmog

+0

檢查我鏈接到的文章。使用'while(reader.Read())' –

+0

請幫忙。我無法讓它工作。我編輯了問題 – Kosmog

0

我會通過JSON對象邏輯轉換成一個C#類,然後應用到C#對象接近它和/或使用DataTables [注:有解決方案,在線,告訴你會很容易地通過一個Object或者List<Object>到數據表,然後在「輕鬆」它傳遞給SQL]

的第一步仍然是任何一個解決方案的打嗝,我怎麼拉,從文件系統大的JSON字符串?

如果您有JSON,請使用json2csharp.com和/或jsonutils.com來檢索類,以便將其反序列化爲您的對象。

StreamReader re = new StreamReader(@"C:\path to file\file.json"); 
JsonTextReader reader = new JsonTextReader(re); 
YourClass DeserializedObject = se.Deserialize<YourClass>(reader); 
Console.WriteLine(DeserializeObject.SomeProperty);