2

我正在尝试通过 c# 检查 twitch.tv 流是否在线。目前我有:

    private bool checkStream(String chan)
    {
        using (var w = new WebClient()) {

            String json_data = w.DownloadString("https://api.twitch.tv/kraken/streams/" + chan);
            JObject stream = JObject.Parse(json_data);
            print(json_data); //just for testing purposes
            if (stream["stream"] != null)
            {
                print("YIPPEE");
            }
        }

        return false;
    }

这是我正在下载的 twitch JSON API:https ://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamschannel

如您所见,如果流当前处于离线状态,则该stream字段只会显示null。但很明显,它仍然存在,所以我的if(stream["stream"]!=null)检查不起作用。以前从未使用过 JSON 或 Newtonsoft 的 json.net,所以我有点不知所措。提前感谢您的帮助!

4

3 回答 3

2

您需要创建一个可以反序列化 json 的类。例如,如果您收到看起来像这样的 json

MyJson = {
   Prop1 : "Property1",
   Prop2 : "Property2"
}

那么你需要创建一个类来充当你的程序和 JSON 流之间的契约。

public class MyJsonClass{
   public string Prop1;
   public string Prop2;

   public MyJsonClass(){
   }
}

现在,您可以将 json 反序列化为您的 C# 类并检查它是否有任何空值:

// Create a MyJson class instance by deserializing your json string
string myJsonString = ...//get your json string
MyJsonClass deserialized = JsonConvert.DeserializeObject<MyJsonClass>(myJsonString);

if ( deserialized.Prop1 == null )
   //etc etc etc
于 2013-05-31T18:51:04.253 回答
1

这是该 Json 响应的完整处理器(免责声明:我为此代码使用了http://json2csharp.com/ ):

public class Links
{
    public string channel { get; set; }
    public string self { get; set; }
}

public class Links2
{
    public string self { get; set; }
}

public class Links3
{
    public string stream_key { get; set; }
    public string editors { get; set; }
    public string subscriptions { get; set; }
    public string commercial { get; set; }
    public string videos { get; set; }
    public string follows { get; set; }
    public string self { get; set; }
    public string chat { get; set; }
    public string features { get; set; }
}

public class Channel
{
    public string display_name { get; set; }
    public Links3 _links { get; set; }
    public List<object> teams { get; set; }
    public string status { get; set; }
    public string created_at { get; set; }
    public string logo { get; set; }
    public string updated_at { get; set; }
    public object mature { get; set; }
    public object video_banner { get; set; }
    public int _id { get; set; }
    public string background { get; set; }
    public string banner { get; set; }
    public string name { get; set; }
    public string url { get; set; }
    public string game { get; set; }
}

public class Stream
{
    public Links2 _links { get; set; }
    public string broadcaster { get; set; }
    public string preview { get; set; }
    public long _id { get; set; }
    public int viewers { get; set; }
    public Channel channel { get; set; }
    public string name { get; set; }
    public string game { get; set; }
}

public class RootObject
{
    public Links _links { get; set; }
    public Stream stream { get; set; }
}

以下是如何使用它:

bool StreamOnline = false;
using (var w = new WebClient())
{

    var jsonData = w.DownloadData("https://api.twitch.tv/kraken/streams/" +  + chan);
    var s = new DataContractJsonSerializer(typeof(RootObject));
    using (var ms = new MemoryStream(jsonData))
    {
        var obj = (RootObject)s.ReadObject(ms);
        StreamOnline = obj.stream == null;
    }

}
return StreamOnline;

请注意,您需要引用System.Runtime.Serialization并添加using System.Runtime.Serialization.Json;使用DataContractJsonSerializer. 如果您不需要每个细节,只需创建stream类型的属性object(在RootObject类中)并检查它是否null存在。

于 2013-05-31T19:00:14.367 回答
0

你有没有试过这个。HasValues 是一个 bool 属性,用于检查是否有子令牌,如果其值为 null,则不会有任何子令牌。

if (stream["stream"].HasValues)
{
    print("YIPPEE");
}else
{
    print("No Stream");
}
于 2013-05-31T19:00:53.617 回答