0

我正在尝试为 School Project构建一个基于 api 的在线货币程序。我做到了,但我正在尝试构建一个功能更强大的程序,所以我决定在我的程序中添加第二个 Windows 窗体。这第二种形式在过去进行货币兑换。我在我的项目中使用的 api 可以做到这一点,所以可以做到,但在 VB 中,当我尝试在字典中获取货币名称时,我收到如下错误:

'Newtonsoft.Json.JsonReaderException' türünde bir yakalanamayan özel durum, Newtonsoft.Json.dll öğesinde oluştu 解析值时遇到意外字符:{。路径 'rates',第 1 行,位置 43。

这是我的代码:

Dim rawResp As String
        Dim request As HttpWebRequest
        Dim response As HttpWebResponse = Nothing
        Dim reader As StreamReader
        Dim jsonResultToDict As Dictionary(Of String, String)
        Dim kurlar As String
        Dim kur As Object
        Dim kurs As String
        request = DirectCast(WebRequest.Create("http://api.fixer.io/" + DateTimePicker1.Value.ToString("yyyy-MM-dd")), HttpWebRequest)
        response = DirectCast(request.GetResponse(), HttpWebResponse)
        reader = New StreamReader(response.GetResponseStream())
        rawResp = reader.ReadToEnd
        jsonResultToDict = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(rawResp)
        kurlar = jsonResultToDict.Item("rates")
        kur = JObject.Parse(kurlar)

顺便说一句,我还没有尝试在组合框中设置货币名称,因为我现在无法获取数据。

这是 api: http: //fixer.io/

感谢您的帮助...

4

1 回答 1

0

我认为因为“rates”的 json 数据不适合您的“String,String”字典模型,Newtonsoft JSON 无法从“String,Single”转换(注意货币代码如何用双引号括起来,并且汇率是不是)。因此,您需要创建一个可以轻松从 JSON 转换的类对象。

例如,该类可能如下所示:

Public Class ForExRates Public base As String Public [date] As String 'enclose var in brackets; Date is a VB keyword. Public rates as Dictionary(Of String, Single)
Public Sub New() End Sub End Class

然后,将Dictionary(Of String, String)的任何引用替换为ForExRates

好的,所以您的代码应如下所示:

    Dim rawResp As String
    Dim request As HttpWebRequest
    Dim response As HttpWebResponse = Nothing
    Dim reader As StreamReader
    Dim objForExRates As ForExRates

    request = DirectCast(WebRequest.Create("http://api.fixer.io/" + DateTimePicker1.Value.ToString("yyyy-MM-dd")), HttpWebRequest)
    response = DirectCast(request.GetResponse(), HttpWebResponse)
    reader = New StreamReader(response.GetResponseStream())
    rawResp = reader.ReadToEnd
    objForExRates = JsonConvert.DeserializeObject(Of ForExRates)(rawResp)
    Dim sCAD As String = "Rate for 'CAD': " + objForExRates.rates("CAD").ToString()  
于 2017-12-05T16:30:16.770 回答