在c#中导航JSON数据



我想检查一下是否抽搐。电视流是否通过c#在线。目前我有:

    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,所以我有点不知所措。提前感谢任何帮助!

您需要创建一个可以反序列化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

这是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

你试过了吗?HasValues是一个bool属性,检查是否有子标记,如果它的值为空,则没有任何子标记。

if (stream["stream"].HasValues)
{
    print("YIPPEE");
}else
{
    print("No Stream");
}

最新更新