2012-12-12 35 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);