C# 使用SearchUPC API并将字符串结果转换为JSON

C# 使用SearchUPC API并将字符串结果转换为JSON,c#,json,api,dotnet-httpclient,C#,Json,Api,Dotnet Httpclient,我正在尝试使用一个在线API来检索基于UPC代码的数据,然后将其转换为一个对象。他们的方法之一是以JSON格式获取数据 您得到的结果如下所示: { "0": { "productname": "Play-doh Single Can by Hasbro", "imageurl": "http://ecx.images-amazon.com/images/I/31ZzLhzYDEL._SL160_.jpg", "producturl": "", "price

我正在尝试使用一个在线API来检索基于UPC代码的数据,然后将其转换为一个对象。他们的方法之一是以JSON格式获取数据

您得到的结果如下所示:

  {
  "0": {
    "productname": "Play-doh Single Can by Hasbro",
    "imageurl": "http://ecx.images-amazon.com/images/I/31ZzLhzYDEL._SL160_.jpg",
    "producturl": "",
    "price": "10.01",
    "currency": "GBP",
    "saleprice": "",
    "storename": "N/A"
  },
  "1": {
    "productname": "PLAY-DOH Compound Tropical Pink - Two, 5 oz Cans (10 oz)",
    "imageurl": "http://ecx.images-amazon.com/images/I/51LbjiXtEjL._SL160_.jpg",
    "producturl": "",
    "price": "37.07",
    "currency": "GBP",
    "saleprice": "",
    "storename": "N/A"
  }
}
public class Foo
{
    public string ProductName { get; set; }
    public string ImageUrl { get; set; }
    public string ProductUrl { get; set; }
    public string Price { get; set; }
    public string Currency { get; set; }
    public string SalePrice { get; set; }
    public string StoreName { get; set; }
}
var result = JsonConvert.DeserializeObject<Dictionary<string, Foo>>(json);
我正在8.1应用程序中使用.NETC#4.5.2。我正在尝试使用HttpClient,但我不断得到奇怪的结果,就好像JSON的格式不正确一样。我把它放到了一个在线Json编辑器中,它看起来很好,所以我不确定问题出在哪里。我运行的代码非常简单。看起来像这样

public async Task<string> GetUpc(string upcCode)
{
    var url = "http://www.searchupc.com/handlers/";
    var result = string.Empty;

    using (HttpClient client = new HttpClient())
    {
        //    client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = await client.GetAsync("http://www.searchupc.com/handlers/upcsearch.ashx?request_type=3&access_token=MY_TOKEN&upc=0653569289791");

        result = await response.Content.ReadAsStringAsync();

        //JToken token = await Task.Run(() => JObject.Parse(reader.ReadLine()));

        //string name = (string)token.SelectToken("productname");

        JsonSerializer s = new JsonSerializer();
        var i = JsonConvert.DeserializeObject<dynamic>(result);

    }
    return result;
}
公共异步任务GetUpc(字符串upcCode)
{
变量url=”http://www.searchupc.com/handlers/";
var result=string.Empty;
使用(HttpClient=new HttpClient())
{
//client.BaseAddress=新Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=await client.GetAsync(“http://www.searchupc.com/handlers/upcsearch.ashx?request_type=3&access_token=MY_TOKEN&upc=0653569289791");
结果=wait response.Content.ReadAsStringAsync();
//JToken token=wait Task.Run(()=>JObject.Parse(reader.ReadLine());
//字符串名称=(字符串)标记。选择标记(“产品名称”);
JsonSerializer s=新的JsonSerializer();
var i=JsonConvert.DeserializeObject(结果);
}
返回结果;
}
当我检查“I”时,它只是API结果的字符串表示。我还尝试使用JsonConvert.DeserializeObject并将字符串传递给它,但它仍然只返回一个具有字符串表示形式的对象。就像它知道它是一个json对象,但格式是错误的

到目前为止,我找到的唯一解决方案是使用JObject.Parse作为标记,然后使用SelectToken遍历树


你知道怎么做吗?该解决方案感觉不正确。

鉴于键名在C#中无效,并且由于键是唯一的,我认为最简单的方法是将其解析到
字典中,其中
Foo
声明如下:

  {
  "0": {
    "productname": "Play-doh Single Can by Hasbro",
    "imageurl": "http://ecx.images-amazon.com/images/I/31ZzLhzYDEL._SL160_.jpg",
    "producturl": "",
    "price": "10.01",
    "currency": "GBP",
    "saleprice": "",
    "storename": "N/A"
  },
  "1": {
    "productname": "PLAY-DOH Compound Tropical Pink - Two, 5 oz Cans (10 oz)",
    "imageurl": "http://ecx.images-amazon.com/images/I/51LbjiXtEjL._SL160_.jpg",
    "producturl": "",
    "price": "37.07",
    "currency": "GBP",
    "saleprice": "",
    "storename": "N/A"
  }
}
public class Foo
{
    public string ProductName { get; set; }
    public string ImageUrl { get; set; }
    public string ProductUrl { get; set; }
    public string Price { get; set; }
    public string Currency { get; set; }
    public string SalePrice { get; set; }
    public string StoreName { get; set; }
}
var result = JsonConvert.DeserializeObject<Dictionary<string, Foo>>(json);
然后像这样使用它:

  {
  "0": {
    "productname": "Play-doh Single Can by Hasbro",
    "imageurl": "http://ecx.images-amazon.com/images/I/31ZzLhzYDEL._SL160_.jpg",
    "producturl": "",
    "price": "10.01",
    "currency": "GBP",
    "saleprice": "",
    "storename": "N/A"
  },
  "1": {
    "productname": "PLAY-DOH Compound Tropical Pink - Two, 5 oz Cans (10 oz)",
    "imageurl": "http://ecx.images-amazon.com/images/I/51LbjiXtEjL._SL160_.jpg",
    "producturl": "",
    "price": "37.07",
    "currency": "GBP",
    "saleprice": "",
    "storename": "N/A"
  }
}
public class Foo
{
    public string ProductName { get; set; }
    public string ImageUrl { get; set; }
    public string ProductUrl { get; set; }
    public string Price { get; set; }
    public string Currency { get; set; }
    public string SalePrice { get; set; }
    public string StoreName { get; set; }
}
var result = JsonConvert.DeserializeObject<Dictionary<string, Foo>>(json);
var result=JsonConvert.DeserializeObject(json);
根据您的JSON示例,我得到的结果如下:

旁注:


如果您可以修改JSON,看起来您实际上并没有使用这些键,它们只是按顺序递增,请使用带有
[]
符号的列表。

非常感谢。既然你这么说,那就完全有道理了!我只是在那之后拿了那本字典,做了一个循环,使它成为一个常规列表,一切都准备好了。再次感谢!