Rest 为什么我在与具有非常相似的代码/数据的Newtonshoft.Json.Linq.[JArray,JObject]竞争时会得到一个InvalidCastException?
此代码工作正常-返回与REST查询匹配的单个记录: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)
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);
}