【问题标题】:Serialize json - Unable to cast object of type 'XXX' to type 'System.Collections.IEnumerable'序列化 json - 无法将“XXX”类型的对象转换为“System.Collections.IEnumerable”类型
【发布时间】:2020-01-25 15:56:25
【问题描述】:

尝试使用以下方式序列化 json:

<JsonArray>
Public Class NumbersItem
    Public Sub New(objTime As Long, objSolValue As Long, objUsageValue As Long)
        DetectionTime = objTime
        SolValue = objSolValue
        UsageValue = objUsageValue
    End Sub
    Public ReadOnly Property DetectionTime As Long
    Public ReadOnly Property SolValue As Long
    Public ReadOnly Property UsageValue As Long
End Class

获取数据并转换:

'Get Solar Gen
Dim SolarResultsfound = VATWebClient.UploadString("https://XXXXXX.org/feed/data.json?id=" + SolarID + "&start=" + UNStartTime.ToString + "&end=" + UNEndTime.ToString + "&interval=1300", "")

'Get Usage
Dim UsageResultsfound = VATWebClient.UploadString("https://xxxxxx.org/feed/data.json?id=" + UsageID + "&start=" + UNStartTime.ToString + "&end=" + UNEndTime.ToString + "&interval=1300", "")

编辑:我返回的数据在两个请求中都采用以下格式,每个最多 3k 集。

[[1579617389000,132],[1579617399000,136],[1579617409000,139],[1579617419000,137]]

编辑:然后我想将两者结合起来(将来还会有更多)发送到谷歌图表。我从第一个结果中获取 unix 时间(第一列)和值(第二列),并且只从第二个结果中获取值列。

'Create an list from json results
Dim numbers As New List(Of NumbersItem)()
Dim jsonArrays = JArray.Parse(SolarResultsfound)
Dim jsonUsageArrays = JArray.Parse(UsageResultsfound)
For Each array As JArray In jsonArrays.Children()
    For Each usage As JArray In jsonUsageArrays
          numbers.Add(New NumbersItem(CType(array.First, Long), CType(array.Last, Long), CType(usage.Last, Long)))
    Next
Next

然后我尝试使用以下内容进行序列化。

Dim jsonTxt As String = Newtonsoft.Json.JsonConvert.SerializeObject(numbers)

并得到以下错误

无法将“xxxxxx.NumbersItem”类型的对象转换为“System.Collections.IEnumerable”类型。

我感觉这一定是我调用序列化程序的方式,但我找不到正确的语法。

【问题讨论】:

  • 你能发布一些你的 json 的简短示例(SolarResultsfound、UsageResultsfound)吗?
  • 谢谢@CruleD,我已经为问题添加了更多细节

标签: vb.net jsonserializer


【解决方案1】:

抱歉,我似乎已经回答了我自己的问题。在添加更多解释的同时,我发现自己在思考是否可以在同一个谷歌图表中组合多个数据集,是的!

生成如下两个数据表。

//setup DT for solar production
var dt1 = new google.visualization.DataTable();
dt1.addColumn('number', 'Date');
dt1.addColumn('number', 'Solar (watts)');
dt1.addRows(@GenResults);

//setup DT for usage
var dt2 = new google.visualization.DataTable();
dt2.addColumn('number', 'Date');
dt2.addColumn('number', 'Usage (watts)');
dt2.addRows(@UseResults);

然后我将这两个数据表合并到一个连接视图中,它就可以工作了。

var data = google.visualization.data.join(dt1, dt2, 'full', [[0, 0]], [1], [1]);

谢谢, 理查德。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多