0

我不确定如何修复以下错误,并在此代码中寻找一些帮助,我发现我已尝试适应在应用程序嵌入式 VB.Net 中使用:

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[System.Object]”,因为该类型需要 JSON 数组(例如 [1,2, 3])正确反序列化。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。路径“错误”,第 1 行,位置 9。

下面是产生此错误的代码

Dim OutputText As String
Dim Worksteps = JsonConvert.DeserializeObject(Of List(Of Object))(responseFromServer)
Dim token As JToken
Dim SheetName As String
Dim SheetStatus As String
Dim Completed As Boolean
For Each value As Object In Worksteps
    token = JObject.Parse(value.ToString())
    SheetName = token.SelectToken("name")
    SheetStatus = token.SelectToken("status")
    Dim parts() As String = SheetName.Split(" "c)
    If parts(0) = "Sheet_1" Then
        If SheetStatus = "COMPLETED" Then
            Completed = True
            Exit For
        End If
    End If
Next value
Select Case Completed
Case True
    OutputText = "Sheet_1 Status is COMPLETED"
Case False
    OutputText = "Sheet_1 Status is NOT COMPLETED"
End Select

这是我试图解析的 JSON。我的假设是,在尝试制作工作步骤列表之前,我需要先解析工作步骤,但我不知道该怎么做。

{
  "error": null,
  "worksteps": [
    {
      "id": "_210504_125916572_029875",
      "name": "Sheet_1  4/4",
      "job": {
        "id": "060671-21",
        "name": "2021 Laramie High School"
      },
      "status": "COMPLETED",
      "amountPlanned": 544,
      "wastePlanned": 60,
      "amountProduced": 169,
      "wasteProduced": 69,
      "deviceId": "114",
      "types": [
        "ConventionalPrinting"
      ],
      "sequenceType": "SheetfedPrinting",
      "start": "2021-05-05T09:46:06-05:00",
      "end": "2021-05-05T09:48:38-05:00",
      "startPlanned": "2021-05-05T07:52:22-05:00",
      "endPlanned": null,
      "setuptimePlanned": 0,
      "prodtimePlanned": 0,
      "actualTimes": [
        {
          "timeTypeGroupName": "Production time",
          "timeTypeName": "Execution time",
          "duration": 33
        },
        {
          "timeTypeGroupName": "Production time",
          "timeTypeName": "Setup time",
          "duration": 79
        },
        {
          "timeTypeGroupName": "Auxiliary time",
          "timeTypeName": "Auxiliary time",
          "duration": 40
        },
        {
          "timeTypeGroupName": "",
          "timeTypeName": "",
          "duration": 0
        }
      ]
    },
    {
      "id": "_210506_072306983_020035",
      "name": "Sheet_2  4/4",
      "job": {
        "id": "060671-21",
        "name": "2021 Laramie High School"
      },
      "status": "WAITING",
      "amountPlanned": 0,
      "wastePlanned": 0,
      "amountProduced": 0,
      "wasteProduced": 0,
      "deviceId": "XL106_Pool",
      "types": [
        "ConventionalPrinting"
      ],
      "sequenceType": "SheetfedPrinting",
      "start": null,
      "end": null,
      "startPlanned": null,
      "endPlanned": null,
      "setuptimePlanned": 0,
      "prodtimePlanned": 0,
      "actualTimes": null
    }
  ]
}
4

1 回答 1

1

这是我想出的将上面的 JSON 示例转换为 XML,然后提取工作表和状态的值的解决方案:

'Parse the JSON responseFromServer into an XMLDocument
Dim xdoc As New XmlDocument
' "job_worksteps" is the name being provided 
xdoc = JsonConvert.DeserializeXmlNode(responseFromServer,"job_worksteps")
' Look in the XML to determine the if a specified sheet has been completed
Dim nodes As XmlNodeList = xdoc.DocumentElement.SelectNodes("/job_worksteps/worksteps")
Dim Completed As Boolean
Dim SheetName, SheetStatus, OutputText As String
Dim TargetSheet As String = "Sheet_" + triggerEvent.String2 ' Integer as string included in the Prinergy RBA Trigger HTTP Post
' Loop through the XML nodes to find the SheetName node "name" and SheetStatus node "status"
For Each node As XmlNode In nodes
    SheetName = node.SelectSingleNode("name").InnerText
    SheetStatus = node.SelectSingleNode("status").InnerText
    Dim parts() As String = SheetName.Split("  ")
    ' Validate the TargetSheet name has a Status of "COMPLETED"
    If parts(0) = TargetSheet Then
    If SheetStatus = "COMPLETED" Then
        Completed = True
        Exit For
        End If
    End If
Next
' Format the output we want for this test
' (The final Boolean value will actually be used to trigger another function if it is True)
Select Case Completed
Case True
    OutputText = "Sheet_1 Status is COMPLETED"
Case False
    OutputText = "Sheet_1 Status is NOT COMPLETED"
End Select

下面是一些附加代码生成的 XML,用于将其附加到 OutputText 变量:

Sheet_1 Status is COMPLETED

<job_worksteps>
    <error />
    <worksteps>
        <id>_210505_073301677_027121</id>
        <name>Sheet_1  4/4</name>
        <job>
            <id>060671-21</id>
            <name>2021 Laramie High School</name>
        </job>
        <status>COMPLETED</status>
        <amountPlanned>544</amountPlanned>
        <wastePlanned>60</wastePlanned>
        <amountProduced>169</amountProduced>
        <wasteProduced>69</wasteProduced>
        <deviceId>114</deviceId>
        <types>ConventionalPrinting</types>
        <sequenceType>SheetfedPrinting</sequenceType>
        <start>2021-05-05T09:46:06-05:00</start>
        <end>2021-05-05T09:48:38-05:00</end>
        <startPlanned>2021-05-05T07:52:22-05:00</startPlanned>
        <endPlanned />
        <setuptimePlanned>0</setuptimePlanned>
        <prodtimePlanned>0</prodtimePlanned>
        <actualTimes />
    </worksteps>
    <worksteps>
        <id>_210505_073301714_027146</id>
        <name>Sheet_2  4/4</name>
        <job>
            <id>060671-21</id>
            <name>2021 Laramie High School</name>
        </job>
        <status>WAITING</status>
        <amountPlanned>0</amountPlanned>
        <wastePlanned>0</wastePlanned>
        <amountProduced>0</amountProduced>
        <wasteProduced>0</wasteProduced>
        <deviceId>XL106_Pool</deviceId>
        <types>ConventionalPrinting</types>
        <sequenceType>SheetfedPrinting</sequenceType>
        <start />
        <end />
        <startPlanned />
        <endPlanned />
        <setuptimePlanned>0</setuptimePlanned>
        <prodtimePlanned>0</prodtimePlanned>
        <actualTimes />
    </worksteps>
</job_worksteps>

--

于 2021-05-19T20:33:55.377 回答