1

我正在尝试解析一个 json 文件,然后对其进行操作以将数据插入 SQL Server 2008 数据库。

例子:

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”节点,在数据库中插入一个新项目

编辑2:

这就是我所做的。

    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 的路径是 on/sources/prgs/ )

4

3 回答 3

3

我认为您不想序列化流。

JsonSerializer.SerializeToString(sr)

您想从流中反序列化。

JsonSerializer.Deserialize

出于性能原因,您可能希望使用JsonReader 。

您的 XML 示例将整个文件加载到内存中 - 您不想对大型文档执行此操作。reader.Read()模式更适合处理大文件。

于 2012-12-12T09:03:41.400 回答
3

对于每个有同样问题的人,我所做的是(注意:这只是一个例子)

顺便说一句,感谢所有试图回答我问题的人,我为我的错误感到抱歉。

        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();
于 2012-12-12T10:35:48.520 回答
1

我会通过将该 JSON 对象转换为 C# 类,然后将逻辑应用于 C# 对象和/或使用DataTables 来处理它 [注意:网上有一些解决方案表明您可以轻松地将Objector传递List<Object>给 DataTable,然后传递它“轻松"到 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);
于 2016-08-16T20:42:54.697 回答