阅读json API

时间:2016-02-11 14:38:44

标签: c# json asp.net-mvc api json.net

我正在尝试通过访问商店推出的API来获取产品列表。以下是我的代码

public class CKProductAPI
{
    public List<ProductListNames> ProductList(string url)
    {
        List<ProductListNames> objProducts = new List<ProductListNames>();

        try
        {
            var wc = new WebClient();
            wc.Headers.Add("Fk-Affiliate-Id", ConfigurationManager.AppSettings["FK-AFFID"]);
            wc.Headers.Add("Fk-Affiliate-Token", ConfigurationManager.AppSettings["FK-TKN"]);
            string productFeedXml = wc.DownloadString(url);

            JObject jObject = (JObject)JsonConvert.DeserializeObject(productFeedXml);

            var jProductData = jObject["productInfoList"];

            foreach (var item in jProductData)
            {
                string strproductId, strtitle, strimageUrls, strmaximumRetailPrice, strsellingPrice, strcurrency, strproductBrand, strproductUrl, strinStock;

                try { strproductId = item["productBaseInfo"]["productIdentifier"]["productId"].ToString(); }
                catch { strproductId = ""; }
                try { strtitle = item["productBaseInfo"]["productAttributes"]["title"].ToString(); }
                catch { strtitle = ""; }
                try { strimageUrls = item["productBaseInfo"]["productAttributes"]["imageUrls"].ToString(); }
                catch { strimageUrls = ""; }
                try { strmaximumRetailPrice = item["productBaseInfo"]["productAttributes"]["maximumRetailPrice"].ToString(); }
                catch { strmaximumRetailPrice = ""; }
                try { strsellingPrice = item["productBaseInfo"]["productAttributes"]["sellingPrice"].ToString(); }
                catch { strsellingPrice = ""; }
                try { strcurrency = item["productBaseInfo"]["productAttributes"]["currency"].ToString(); }
                catch { strcurrency = ""; }
                try { strproductBrand = item["productBaseInfo"]["productAttributes"]["productBrand"].ToString(); }
                catch { strproductBrand = ""; }
                try { strproductUrl = item["productBaseInfo"]["productAttributes"]["productUrl"].ToString(); }
                catch { strproductUrl = ""; }
                try { strinStock = item["productBaseInfo"]["productAttributes"]["inStock"].ToString(); }
                catch { strinStock = ""; }

                objProducts.Add(new ProductListNames
                {
                    productId = strproductId,
                    title = strtitle,
                    imageUrls = strimageUrls,
                    maximumRetailPrice = strmaximumRetailPrice,
                    sellingPrice = strsellingPrice,
                    currency = strcurrency,
                    productBrand = strproductBrand,
                    productUrl = strproductUrl,
                    inStock = strinStock
                });
            }

        }
        catch (Exception)
        {
            throw;
        }
        return objProducts;
    }


    public class ProductListNames
    {
        public string productId { get; set; }
        public string title { get; set; }
        public string imageUrls { get; set; }
        public string maximumRetailPrice { get; set; }
        public string sellingPrice { get; set; }
        public string currency { get; set; }
        public string productUrl { get; set; }
        public string productBrand { get; set; }
        public string inStock { get; set; }
        public string size { get; set; }
    }
}

我收到以下错误::

  

Newtonsoft.Json.JsonReaderException:解析值时遇到意外的字符:&lt;。路径&#39;&#39;,第0行,第0位。

2 个答案:

答案 0 :(得分:1)

它似乎是您的源JSON字符串无效或实际上不是JSON字符串。

请检查您正在进行的HTTP请求,服务器是否为您提供JSON。 HTTP服务可能会根据您要添加到HTTP请求的Accept标头做出不同的响应。

要确保您询问有关JSON的服务,可以在请求中添加Accept: application/JSON HTTP标头。否则,服务器可能会自行决定并根据您的请求使用XML进行响应。

如果您的服务器使用JSON响应,则可能有所帮助:

var wc = new WebClient();
client.Headers.Set("Accept", "application/json");

您还可以检查Content-Type您的回复,但是您需要使用另一种WebClient方法,而不是DownloadString

答案 1 :(得分:1)

您似乎正在获取xml响应。 如果添加ACCEPT标头没有帮助(如refgor所说),那么您可能需要首先将xml序列化为json,然后将其用作JObject。这可能有所帮助。

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

SO Post

然后,您可以使用JObject.Parse(jsonText)

解析jsonText