2016-01-09 3 views
1

Я пытаюсь использовать онлайн-API для извлечения данных на основе кода UPC, а затем преобразования его в объект. Одним из их методов является получение данных в формате JSON.Использование SearchUPC API и преобразование результата строки в 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" 
    } 
} 

Я использую .NET C# 4.5.2 в 8.1 приложения. Я пытаюсь использовать 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 и передал ему строку, но он все же просто возвращает объект, который имеет строковое представление снова и снова. Это похоже, что он знает, что это объект json, но формат неправильный.

Единственное решение, которое я выяснил до сих пор, это использовать JObject.Parse как токен, а затем использовать SelectToken для перемещения по дереву.

Любые идеи, что делать? Решение не кажется правильным.

ответ

1

Учитывая, что имя ключа является недействительным в 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, это результат я получаю:

Parse Result

Примечание стороны:

Если вы можете изменить JSON, кажется, что вы на самом деле не использование для этих клавиш, они просто последовательно увеличивается, используйте список с [ ] нотации вместо.

+1

Perfect Спасибо. Теперь, когда вы это говорите, становится совершенно понятным! Я просто взял этот словарь после этого и сделал цикл, чтобы сделать его регулярным списком, и все настроено. Еще раз спасибо! – gcoleman0828

Смежные вопросы