使用 SearchUPC API 并将字符串结果转换为 JSON
Using SearchUPC API and convert string result to JSON
我正在尝试使用在线 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"
}
}
我在 8.1 应用程序中使用 .NET C# 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;
}
当我检查 'i' 时,它只是 API 结果的字符串表示形式。我还尝试使用 JsonConvert.DeserializeObject 并将字符串传递给它,但它仍然只是 returns 一个对象,它一遍又一遍地具有字符串表示形式。就好像它知道它是一个 json 对象但是格式不对。
到目前为止我想出的唯一解决方案是使用 JObject.Parse 作为标记,然后使用 SelectToken 遍历树。
有什么想法吗?解决方案感觉不对。
鉴于键名在 C# 中无效并且看到键是唯一的,我认为最简单的方法是将其解析为 Dictionary<string, Foo>
,其中 Foo
声明如下:
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);
给定你的样本 JSON,这是我得到的结果:
旁注:
如果你可以修改 JSON,看起来你实际上并没有使用这些键,它们只是按顺序递增,请改用带有 [ ]
符号的列表.
我正在尝试使用在线 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"
}
}
我在 8.1 应用程序中使用 .NET C# 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;
}
当我检查 'i' 时,它只是 API 结果的字符串表示形式。我还尝试使用 JsonConvert.DeserializeObject 并将字符串传递给它,但它仍然只是 returns 一个对象,它一遍又一遍地具有字符串表示形式。就好像它知道它是一个 json 对象但是格式不对。
到目前为止我想出的唯一解决方案是使用 JObject.Parse 作为标记,然后使用 SelectToken 遍历树。
有什么想法吗?解决方案感觉不对。
鉴于键名在 C# 中无效并且看到键是唯一的,我认为最简单的方法是将其解析为 Dictionary<string, Foo>
,其中 Foo
声明如下:
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);
给定你的样本 JSON,这是我得到的结果:
旁注:
如果你可以修改 JSON,看起来你实际上并没有使用这些键,它们只是按顺序递增,请改用带有 [ ]
符号的列表.