从 C# 中的 JSON 对象获取对象值

Posted

技术标签:

【中文标题】从 C# 中的 JSON 对象获取对象值【英文标题】:Get Object Value from JSON Object in C# 【发布时间】:2018-11-15 06:18:12 【问题描述】:

这是我想要在这里实现的目标:

    从数据库中获取文件名和 ID 列表 在网络路径上搜索那些文件 存储所有未找到文件的 ID 在第二个数据库中搜索该 ID 在网络路径上搜索那些文件 列出在任一位置均未找到文件的所有 ID。

我遇到的问题是尝试使用我收集的结果中的文件名。

运行代码时,会显示从数据库收集的原始 JSON 数据,但是当尝试仅列出文件名时,我什么也得不到(甚至没有错误)

关于如何解决这个问题并列出文件名以便我以后搜索它们的任何想法?或者有更好的方法吗?

另请注意:由于使用的 SQL 服务器版本,我必须使用 FOR XML,因为 FOR JSON 不兼容。

编辑:使用 Prany 提供的代码,我现在只能输出音频文件名,但我尝试并输出 sCallId 我得到一个重复问题(见下面的输出):

Getting Calls
2016\03\30\300320161614210106361-00000934412405.asf--84377-3668343241-514513
2016\03\30\300320161614210106361-00000934412405.asf--84385-3668343557-255773
2016\03\30\300320161614210106361-00000934412405.asf--84392-3668344445-516453
2016\03\30\300320161614210106361-00000934412405.asf--85000-3668749568-733799
2016\03\30\300320161614210106361-00000934412405.asf--85604-3668872399-722313
2016\03\30\300320161620220106362-00000934052048.asf--84377-3668343241-514513
2016\03\30\300320161620220106362-00000934052048.asf--84385-3668343557-255773
2016\03\30\300320161620220106362-00000934052048.asf--84392-3668344445-516453
2016\03\30\300320161620220106362-00000934052048.asf--85000-3668749568-733799
2016\03\30\300320161620220106362-00000934052048.asf--85604-3668872399-722313
2016\03\30\300320161634220106363-00000933211384.asf--84377-3668343241-514513
2016\03\30\300320161634220106363-00000933211384.asf--84385-3668343557-255773
2016\03\30\300320161634220106363-00000933211384.asf--84392-3668344445-516453
2016\03\30\300320161634220106363-00000933211384.asf--85000-3668749568-733799
2016\03\30\300320161634220106363-00000933211384.asf--85604-3668872399-722313
2016\04\04\040420160908190106389-00000527974488.asf--84377-3668343241-514513
2016\04\04\040420160908190106389-00000527974488.asf--84385-3668343557-255773
2016\04\04\040420160908190106389-00000527974488.asf--84392-3668344445-516453
2016\04\04\040420160908190106389-00000527974488.asf--85000-3668749568-733799
2016\04\04\040420160908190106389-00000527974488.asf--85604-3668872399-722313
2016\04\05\050420161913220106406-00000405271715.asf--84377-3668343241-514513
2016\04\05\050420161913220106406-00000405271715.asf--84385-3668343557-255773
2016\04\05\050420161913220106406-00000405271715.asf--84392-3668344445-516453
2016\04\05\050420161913220106406-00000405271715.asf--85000-3668749568-733799
2016\04\05\050420161913220106406-00000405271715.asf--85604-3668872399-722313

下面是我目前用来尝试执行此操作的代码。

    //Run the SQL and wrap the output in results tags to fix Multiple Root Elements error. 
    string liveXML = "<results>" + cmd2.ExecuteScalar().ToString() + "</results>";
    //Create new XML Document
    XmlDocument LiveDoc = new XmlDocument();
    LiveDoc.LoadXml(liveXML);
    //Conver XML to JSON
    sjsonLive = JsonConvert.SerializeXmlNode(LiveDoc);
    //Output RAW JSON
    txtOut.AppendText("\r\n" + sjsonLive); 
    //Parse JSON into an Array
    var files = JObject.Parse(sjsonLive);


    //We want to run this values in a files seach, but for now let's print it to txtOut
    foreach (var f in files.SelectTokens("$..calls..@audioFileName"))
    foreach (var c in files.SelectTokens("$..calls..@sCallID"))
    
        txtOut.AppendText("\r\n" + f.ToString() + " - " + c.ToString());
        //Conduct File Search Here...
    

示例 JSON 数据:


"results": 
    "calls": [
            "@audioFileName": "2016\\03\\30\\300320161614210106361-00000934412405.asf",
            "@sCallID": "84377-3668343241-514513"
        , 
            "@audioFileName": "2016\\03\\30\\300320161620220106362-00000934052048.asf",
            "@sCallID": "84385-3668343557-255773"
        , 
            "@audioFileName": "2016\\03\\30\\300320161634220106363-00000933211384.asf",
            "@sCallID": "84392-3668344445-516453"
        , 
            "@audioFileName": "2016\\04\\04\\040420160908190106389-00000527974488.asf",
            "@sCallID": "85000-3668749568-733799"
        , 
            "@audioFileName": "2016\\04\\05\\050420161913220106406-00000405271715.asf",
            "@sCallID": "85604-3668872399-722313"
        
    ]


【问题讨论】:

【参考方案1】:

编辑:

您可以使用下面的标记选择器

files.SelectTokens("$..calls..@audioFileName")

编辑 2:

 var calls = files.SelectTokens("$..calls..@sCallID").ToList();
 var audiofiles = files.SelectTokens("$..calls..@audioFileName").ToList();
 for (int i = 0; i <= audiofiles.Count; i++)
        
            //Conduct File search 
            if (true)
            
               //access by index like audiofiles[i] and append to the query
            
            else
            
             //access calls by index like calls[i] and append to the query

            

        

【讨论】:

由于“results”不是数组,所以我认为 JArray.Parse 会失败 是的,尝试此操作时出现错误“从 JsonReader 读取 JArray 时出错。当前 JsonReader 项不是数组” @Prany 这工作并打印“@audioFileName”值。有没有办法可以调整它以将“@sCallId”也存储到一个名为 c 的字符串中?例如,如果文件 f 不存在,则将 c 添加到“无文件”列表(然后将用于查询我们的第二个数据库),否则输出消息说找到文件 您可以在第一个 foreach..files.SelectTokens("$..calls..@sCallID") 内为 sCallID 添加另一个 foreach @Prany 这行得通.. 对于它看到的所有 5 个调用 ID 的每个文件,这里可能会做错事。例如。文件 1 - Callid 1 文件 1 - Callid 2 等 foreach (var f in files.SelectTokens("$..calls..@audioFileName")) foreach (var c in files.SelectTokens("$..calls..@sCallID")) txtOut.AppendText("\r\n" + f.ToString() + " - " + c.ToString()); //Conduct File Search Here...

以上是关于从 C# 中的 JSON 对象获取对象值的主要内容,如果未能解决你的问题,请参考以下文章

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

从 C# 中的对象列表中获取 JSON 文件

c#一个程序把xml文件转化成json对象,怎么从这个程序中获取json对象的值

如何从 JSON 数组中的 JSON 对象中的单个值获取数据?

无法从 sveltekit 循环中的 JSON 对象获取值

从Objective C中的json对象获取值? [关闭]