【问题标题】:Querying JSON with JSONPath or SelectTokens? With JSON.NET in C#使用 JSONPath 或 SelectTokens 查询 JSON?在 C# 中使用 JSON.NET
【发布时间】:2015-08-28 12:52:13
【问题描述】:

我正在尝试在 c# 中使用 Newtonsoft.Json.Net。以下是我需要从中检索数据的 JSON 文件的一部分:

{
    "video":{
        "local_recording_device":{
            "codecs":null
        },
        "preferred_string":"___PREFERRED___",
        "streams":{
            "99176901":{
                "id":"99176901",
                "name":"PTZ Camera",
                "site":"someone",
                "email":"someone@awebsite.com",
                "codec":"VP8 HD1 (720p)",
                "local":true,
                "screen":false,
                "fit_to_window":true,
                "stay_on_top":false,
                "layout":0,
                "native_width":1280,
                "native_height":720,
                "window_width":456,
                "window_height":254,
                "preferred":false,
                "local_recording":false,
                "device_id":"MJPEG Camera",
                "normalized_device_id":"MJPEGCamera",
                "shared_window_id":"MJPEG Camera",
                "enable":true,
                "big_location":"2",
                "x":347,
                "y":737,
                "window_id":"197302",
                "camera_id":null
            },
            "3091494011":{
                "id":"3091494011",
                "name":"Logitech Webcam C930e",
                "site":"Joe Smith",
                "email":"joe@awebsite.com",
                "codec":"VP8 Medium (CIF)",
                "local":false,
                "screen":false,
                "fit_to_window":true,
                "stay_on_top":false,
                "layout":0,
                "native_width":352,
                "native_height":288,
                "window_width":864,
                "window_height":702,
                "preferred":true,
                "local_recording":false,
                "enable":true,
                "big_location":"1",
                "x":204,
                "y":0,
                "window_id":"197296",
                "camera_id":null
            },
            "3798287599":{
                "id":"3798287599",
                "name":"Drive Camera",
                "site":"ASiteName",
                "email":"asitesame@awebsite.com",
                "codec":"VP8 HD1 (720p)",
                "local":true,
                "screen":false,
                "fit_to_window":true,
                "stay_on_top":false,
                "layout":0,
                "native_width":1280,
                "native_height":720,
                "window_width":456,
                "window_height":254,
                "preferred":true,
                "local_recording":false,
                "device_id":"Logitech Webcam C930e",
                "normalized_device_id":"LogitechWebcamC930e",
                "shared_window_id":"Logitech Webcam C930e",
                "enable":true,
                "big_location":"3",
                "x":814,
                "y":737,
                "window_id":"262822",
                "camera_id":null
            }
        }
    }
}

因此,JSON 数据内部是:“视频”,流内部的“流”可以是 x 数量的不同流(流 id)。 “流”(长数字)中的流可以随时更改。在我的示例中,这里有三个。我需要搜索“流”中的所有流,看看它们中是否有与特定电子邮件地址匹配的“电子邮件”。每个流都有一个“电子邮件”。如果电子邮件与我提供的电子邮件地址匹配,我需要检查流“启用”以查看它是真还是假。

感谢任何帮助引导我朝着正确的方向前进。我以前没有处理过 JSON 数据。

【问题讨论】:

  • 你能展示你正在使用的 JSON 和预期的输出吗?

标签: json json.net querying


【解决方案1】:

您可以使用LINQ to JSONSelectTokens 进行所需的查询:

        string json = GetJson();
        var obj = JObject.Parse(json);
        var testEmail = "someone@awebsite.com";

        var streamQuery = obj.SelectTokens("video.streams.*").Where(s => (string)s["email"] == testEmail);
        var firstEnabled = streamQuery.Select(s => (bool?)s["enable"]).FirstOrDefault();

如果启用了所需电子邮件的第一个流,则查询返回 nullable bool,即 truefalse;如果该电子邮件地址没有流,则返回 null

请注意,这将返回与给定电子邮件地址匹配的 first 流的 enabled 状态。如果您想知道是否启用了 any,请执行以下操作:

        var anyEnabled = streamQuery.Any(s => (bool)s["enable"]);

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多