Не могу обратиться к полям json файла

Рейтинг: 1Ответов: 1Опубликовано: 12.03.2015
WebRequest request = WebRequest.Create("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.historicaldata%20where%20symbol%20=%20%22TIBX%22%20and%20startDate%20=%20%222013-01-01%22%20and%20endDate%20=%20%222014-01-01%22&format=json&diagnostics=true&env=store://datatables.org/alltableswithkeys");
WebResponse response = request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
    Type serializationTargetType = typeof(JsonContract);
    DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(serializationTargetType);

    JsonContract jsonDeserialized = (JsonContract)jsonSerializer.ReadObject(stream);
    gv_information.DataSource = jsonDeserialized.query.results.quote;
    DataBind();
}

public class JsonContract
{
    public QueryContract query { get; set; }
}

public class QueryContract
{
    public string count { get; set; }
    public string created { get; set; }
    public string lang { get; set; }
    public DiagnosticsContract diagnostics { get; set; }
    public ResultsContract results { get; set; }
}

public class ResultsContract
{
    public List<QuoteContract> quote { get; set; }
}

public class QuoteContract
{
    //public string Symbol { get; set; }
    public string Date { get; set; }
    public string Open { get; set; }
    public string High { get; set; }
    public string Low { get; set; }
    public string Close { get; set; }
    public string Volume { get; set; }
    public string Adj_Close { get; set; }
}

public class DiagnosticsContract
{
    public List<UrlContract> url { get; set; }
    public string publiclyCallable { get; set; }
    public List<CacheContract> cache { get; set; }
    public List<Query2Contract> query { get; set; }
    public JavascriptContract javascript { get; set; }
}

[DataContract]
public class UrlContract
{
    [DataMember(Name = "execution-start-time")]
    public string ExecutionStartTime { get; set; }
    [DataMember(Name = "execution-stop-time")]
    public string ExecutionStopTime { get; set; }
    [DataMember(Name = "execution-time")]
    public string ExecutionTime { get; set; }
    [DataMember(Name = "content")]
    public string Content { get; set; }
}

public class CacheContract
{
}

public class Query2Contract
{
}

public class JavascriptContract
{
}

Ответы

▲ 1

DataContractJsonSerializer ожидает аттрибуты [DataContract]/[DataMember] на всех (де)сериализуемых классах и полях:

[DataContract]
public class JsonContract
{
    [DataMember]
    public QueryContract query { get; set; }
}

[DataContract]
public class QueryContract
{
    [DataMember]
    public string count { get; set; }
    [DataMember]
    public string created { get; set; }
    [DataMember]
...

Если их расставить - код десериализации из вопроса работает корректно.