【问题标题】:"Cannot deserialize the current JSON object" How to fix this error?“无法反序列化当前 JSON 对象”如何解决此错误?
【发布时间】:2021-05-20 04:54:54
【问题描述】:

我不确定如何修复以下错误,并正在寻找此代码中的一些帮助,我发现我已尝试适应在应用程序嵌入式 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
    }
  ]
}

【问题讨论】:

  • 嗨,汤姆,欢迎来到 Stackoverflow。您遇到的问题已经有了答案。看到这个问题+回答stackoverflow.com/q/21358493/1244816
  • 那个答案和问题是用 C# 编写的,所以它并没有真正以我认为对我的 VB 问题真正有用的方式回答我的问题。我知道我需要以某种方式选择工作流项来反序列化工作流对象数组,但是将建议的方法从 C# 转换为 VB 超出了我的知识库。
  • 补充我上面的评论,我的 C# 经验为零,所以如果有人能帮助我将 Jens Kloster 建议的帖子中的 C# 语法翻译成 VB,那么我可以反序列化“RootOject”,然后列出根对象,这会很有帮助。
  • 请记住,我不是在 Visual Studio 中工作,而是在另一个应用程序中使用嵌入式 VB 版本。 VB 不是我选择的语言,它是用于在柯达印能捷基于规则的自动化环境中创建自定义操作的语言。我通常在另一个名为 Xojo 的 Basic 面向对象版本中编写应用程序,我在解析 JSON 时没有问题。我正在努力让 VB 为我工作。
  • 我仍然想知道如何正确解析我提供的 JSON 样本以提取我正在寻找的值,但是,我找到了将 JSON 转换为 XML 的可行解决方案,但我没有获得我想要的值的问题,可以继续我的印能捷 RBA 项目。如果您有等效的 JSON 解决方案,请将其发布以供其他使用 JSON 苦苦挣扎的人将来参考。

标签: json vb.net deserialization jobjectformatter


【解决方案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>

--

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多