JsonReaderException。如何将 JSON 转换为 ASP.NET C# 字符串?

JsonReaderException. How to convert JSON to ASP.NET C# strings?

我想通过查询将 yahoo finance 股票信息获取到我的 ASP.NET 应用程序中,以将其显示为 GridView。 查询 returns JSON 可能如下所示:

YAHOO.Finance.SymbolSuggest.ssCallback({"ResultSet":{"Query":"zumtobel","Result":[{"symbol":"ZMTBF","name":"ZUMTOBEL AG","exch":"PNK","type":"S","exchDisp":"OTC Markets","typeDisp":"Equity"},{"symbol":"ZAG.VI","name":"ZUMTOBEL GR","exch":"VIE","type":"S","exchDisp":"Vienna","typeDisp":"Equity"},{"symbol":"T9Z.SG","name":"ZUMTOBEL GR","exch":"STU","type":"S","exchDisp":"Stuttgart","typeDisp":"Equity"},{"symbol":"ZAG.SW","name":"ZUMTOBEL GR","exch":"EBS","type":"S","exchDisp":"Swiss","typeDisp":"Equity"},{"symbol":"T9Z.DU","name":"ZUMTOBEL GR","exch":"DUS","type":"S","exchDisp":"Dusseldorf Stock Exchange ","typeDisp":"Equity"},{"symbol":"T9Z.MU","name":"ZUMTOBEL GR","exch":"MUN","type":"S","exchDisp":"Munich","typeDisp":"Equity"},{"symbol":"ZMTBF.PK","name":"ZUMTOBEL AG","exch":"PNK","type":"S","exchDisp":"OTC Markets","typeDisp":"Equity"},{"symbol":"T9Z.F","name":"ZUMTOBEL GR","exch":"FRA","type":"S","exchDisp":"Frankfurt","typeDisp":"Equity"},{"symbol":"0MJH.L","name":"Zumtobel Group AG","exch":"LSE","type":"S","exchDisp":"London","typeDisp":"Equity"},{"symbol":"T9Z.HM","name":"ZUMTOBEL GR","exch":"HAM","type":"S","exchDisp":"Hamburg","typeDisp":"Equity"}]}})

查询字符串在会话变量 Session["sSearch"] 中。 我正在使用 Newtonsoft 中的 Json.NET。 我的代码隐藏文件如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Text;
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections;
using System.Data;

public partial class DepotStockSearch : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Get Stock Data
        int iStockCount;
        string sSearch = Session["sSearch"].ToString();
        string sYahooUrl = "http://autoc.finance.yahoo.com/autoc?query=" + sSearch + "&callback=YAHOO.Finance.SymbolSuggest.ssCallback";
        try
        {
            WebClient WebC = new WebClient();
            string sData = WebC.DownloadString(sYahooUrl);
            JObject joJSON = JObject.Parse(sData);
            iStockCount = joJSON["ResultSet"]["Result"].Count();
            testlabel.Text = iStockCount.ToString(); //Test
            string[,] arr_sQuery = new string[iStockCount, 3];
            if (iStockCount > 0)
            {
                string sSymbol = null;
                string sCompany = null;
                string sExchange = null;
                for (int iCount = 0; iCount < iStockCount; iCount++)
                {
                    JToken jtSymbol = joJSON["ResultSet"]["Result"][iStockCount]["symbol"];
                    JToken jtCompany = joJSON["ResultSet"]["Result"][iStockCount]["name"];
                    JToken jtExchange = joJSON["ResultSet"]["Result"][iStockCount]["exchDisp"];
                    int iParameter = 1;
                    switch (iParameter)
                    {
                        case 0:
                            sSymbol = Methods.JTokenReader(jtSymbol);
                            iParameter++;
                            break;
                        case 1:
                            sCompany = Methods.JTokenReader(jtCompany);
                            iParameter++;
                            break;
                        case 2:
                            sExchange = Methods.JTokenReader(jtExchange);
                            break;
                    }
                    string sArrayValue = null;                    
                    for (int iCount2 = 0; iCount2 < 3; iCount2++)
                    {
                        switch (iCount2)
                        {
                            case 0:
                                sArrayValue = sSymbol;
                                break;
                            case 1:
                                sArrayValue =sCompany;
                                break;
                            case 2:
                                sArrayValue = sExchange;
                                break;
                        }
                        arr_sQuery[iCount,iCount2] = sArrayValue; //Write Stock Data into array
                    }
                }
            }
            else
            {
                //Error
            }
            //Send data to table
            DataTable dtQueryResults = new DataTable();
            dtQueryResults.Columns.Add("Symbol", Type.GetType("System.String"));
            dtQueryResults.Columns.Add("Company", Type.GetType("System.String"));
            dtQueryResults.Columns.Add("Exchange", Type.GetType("System.String"));
            for (int iCount3 = 0; iCount3 < iStockCount; iCount3++)
            {
                dtQueryResults.Rows.Add();
                dtQueryResults.Rows[dtQueryResults.Rows.Count - 1]["Symbol"] = arr_sQuery[iCount3, 0];
                dtQueryResults.Rows[dtQueryResults.Rows.Count - 1]["Company"] = arr_sQuery[iCount3, 1];
                dtQueryResults.Rows[dtQueryResults.Rows.Count - 1]["Exchange"] = arr_sQuery[iCount3, 2];
            }
            QueryTable.DataSource = dtQueryResults;
            QueryTable.DataBind();
        }
        catch(Exception ex)
        {
        }
    } //PageLoad end
}

HTML 看起来像这样:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DepotStockSearch.aspx.cs" Inherits="DepotStockSearch" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link rel="stylesheet" href="stylesheets/default.css" />
    <link rel="shortcut icon" href="pictures/icon.png"/>
    <link href="http://fonts.googleapis.com/css?family=Raleway:400,200,500,600,700,800,300" rel="stylesheet" />
    <title>ASP .NET Aktiendepot</title>
</head>
<body>
<form runat="server">
    <asp:GridView ID="QueryTable" runat="server" AutoGenerateColumns = "false" AlternatingRowStyle-BackColor = "#C2D69B" 
     AllowPaging ="true" PageSize = "50" Caption = "Results">
         <Columns>
             <asp:BoundField ItemStyle-Width = "150px"
              DataField = "Symbol" HeaderText = "Symbol" />
             <asp:BoundField ItemStyle-Width = "150px"
              DataField = "Company" HeaderText = "Company" />
             <asp:BoundField ItemStyle-Width = "150px"
              DataField = "Exchange" HeaderText = "Exchange" />
        </Columns>
    </asp:GridView>
</form>
</body>
</html>

我认为 JSON 转换功能不正常。当我 运行 它发生错误 JsonReaderException not handled: Unexpected character encountered while parsing value: Y. Path '', line 0, position 0. 如果有人能帮助我,我将不胜感激。

你好奥兰多

那是无效的"pure" JSON,开头的YAHOO.Finance.SymbolSuggest.ssCallback(和结尾的)需要去掉。 JSON 对象应以 { 开头并以 } 结尾;一个数组,[]。有关 JSON.

的(非常简单的)语法的描述,请参阅 json.org

因此,如果您有

    const string yahooPrefix = "YAHOO.Finance.SymbolSuggest.ssCallback(";
    const string yahooPostfix = ")";

你会做

        sData = sData.Trim();
        if (sData.StartsWith(yahooPrefix) && sData.EndsWith(yahooPostfix))
        {
            sData = sData.Substring(yahooPrefix.Length, sData.Length - yahooPostfix.Length - yahooPrefix.Length);
        }
        JObject joJSON = JObject.Parse(sData);