Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 为什么我在与具有非常相似的代码/数据的Newtonshoft.Json.Linq.[JArray,JObject]竞争时会得到一个InvalidCastException?_Rest_Httpwebrequest_Json.net_Streamreader_Httpwebresponse - Fatal编程技术网

Rest 为什么我在与具有非常相似的代码/数据的Newtonshoft.Json.Linq.[JArray,JObject]竞争时会得到一个InvalidCastException?

Rest 为什么我在与具有非常相似的代码/数据的Newtonshoft.Json.Linq.[JArray,JObject]竞争时会得到一个InvalidCastException?,rest,httpwebrequest,json.net,streamreader,httpwebresponse,Rest,Httpwebrequest,Json.net,Streamreader,Httpwebresponse,此代码工作正常-返回与REST查询匹配的单个记录: Popul8TheGrid("http://localhost:28642/api/subdepartments/1/10"); private void Popul8TheGrid(string URIToPass) { try { dataGridView1.DataSource = GetRESTData(URIToPass); } catch (WebException webex)

此代码工作正常-返回与REST查询匹配的单个记录:

Popul8TheGrid("http://localhost:28642/api/subdepartments/1/10");

private void Popul8TheGrid(string URIToPass)
{
    try
    {
        dataGridView1.DataSource = GetRESTData(URIToPass);
    }
    catch (WebException webex)
    {
        MessageBox.Show("Eek, a mousey-pooh! ({0})", webex.Message);
    }
}

private JArray GetRESTData(string uri)
{
    var webRequest = (HttpWebRequest) WebRequest.Create(uri);
    var webResponse = (HttpWebResponse) webRequest.GetResponse();
    var reader = new StreamReader(webResponse.GetResponseStream());
    string s = reader.ReadToEnd();
    return JsonConvert.DeserializeObject<JArray>(s);
}
…失败,出现“InvalidCastException未处理…消息=无法将类型为“Newtonsoft.Json.Linq.JObject”的对象强制转换为类型为“Newtonsoft.Json.Linq.JArray”

为什么会这样?从第一个(工作)代码段返回的数据来自MS Access“数据库”

第二个(失败)代码段中的数据来自测试数据:

public DeliveryItemRepository() 
{
    // Just some bogus/test data for now
    Add(new DeliveryItem
    {
        Id = 1, InvoiceNumber = "123", UPC_PLU = "456", VendorItemId = "789", PackSize = 1, Description = "Something", Quantity = 5, Cost = 1.25M, 
        Margin = 0.25M, ListPrice = 1.50M, DepartmentNumber = 42, Subdepartment = "5"
    });

这是控制器方法;在浏览器中输入URI时,它可以正常工作

// Enter "http://localhost:28642/api/1"
[Route("api/DeliveryItems/{ID:int}")] 
public DeliveryItem GetDeliveryItemById(int ID)
{
    return _deliveryItemRepository.GetById(ID);
}
…但这有什么关系,我不知道

更新 有趣的是(也许我很容易被逗乐),这个,OTOH,起作用了:

MessageBox.Show(GetRESTScalarVal("http://localhost:28642/api/deliveries/1"));
. . .
private string GetRESTScalarVal(string uri)
{
    var client = new WebClient();
    return client.DownloadString(uri);
}
我所说的“工作”是指它返回以下内容:

因此,DownloadString()甚至会返回整个json“记录”,我使用的“标量”一词有误导性。也许我应该说“Single”,虽然这也会让人困惑,因为数据类型是同一个名称

问题仍然是如何用单个json“记录”填充datagrid

更新2 奇怪的是,如果我使用不同的控制器方法来获取一条记录,它会起作用:

private void GetDeliveryItemById()
{
    //string uri = string.Format("deliveryitems/{0}", numericUpDownId.Value);
    string uri = string.Format("deliveryitems/{0}/1", numericUpDownId.Value);
    Popul8TheGrid(uri);
}
private JArray GetRESTData(string uri)
{
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        var reader = new StreamReader(webResponse.GetResponseStream());
        string s = reader.ReadToEnd();
        return JsonConvert.DeserializeObject<JArray>(s);
    }
    catch // This method crashes if only one json "record" is found - try this:
    {
        try
        {
            MessageBox.Show(GetScalarVal(uri));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    return null;
}

private string GetScalarVal(string uri)
{
    var client = new WebClient();
    return client.DownloadString(uri);
}
注释掉的代码会爆炸,而另一个,提供的const val为1,可以工作…很糟糕,但它可以工作

更新3 以下存储库代码可能是一个线索/与为什么在获取一个时它不起作用,但在其他情况下却起作用有关:

public SiteMapping GetById(int ID)
{
    return siteMappings.Find(p => p.Id == ID);
}

public IEnumerable<SiteMapping> GetRange(int ID, int CountToFetch)
{
    return siteMappings.Where(i => i.Id >= ID).Take(CountToFetch);
}

因此,试图通过一个特定的ID来寻找是脆弱的;尝试按ID+计数查找效果很好。为什么,我(仍然)不知道…

这可能有点含糊不清,但它是有效的:

private void GetDeliveryItemById()
{
    //string uri = string.Format("deliveryitems/{0}", numericUpDownId.Value);
    string uri = string.Format("deliveryitems/{0}/1", numericUpDownId.Value);
    Popul8TheGrid(uri);
}
private JArray GetRESTData(string uri)
{
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        var reader = new StreamReader(webResponse.GetResponseStream());
        string s = reader.ReadToEnd();
        return JsonConvert.DeserializeObject<JArray>(s);
    }
    catch // This method crashes if only one json "record" is found - try this:
    {
        try
        {
            MessageBox.Show(GetScalarVal(uri));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    return null;
}

private string GetScalarVal(string uri)
{
    var client = new WebClient();
    return client.DownloadString(uri);
}
私有JArray GetRESTData(字符串uri)
{
尝试
{
var webRequest=(HttpWebRequest)webRequest.Create(uri);
var webResponse=(HttpWebResponse)webRequest.GetResponse();
var reader=newstreamreader(webResponse.GetResponseStream());
字符串s=reader.ReadToEnd();
返回JsonConvert.DeserializeObject;
}
catch//如果只找到一条json“记录”,此方法将崩溃-请尝试以下操作:
{
尝试
{
Show(GetScalarVal(uri));
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
返回null;
}
私有字符串GetScalarVal(字符串uri)
{
var client=new WebClient();
返回client.DownloadString(uri);
}