【发布时间】:2015-02-08 15:26:26
【问题描述】:
我对使用 JSON.net 还很陌生,并且遇到了一些我得到的 json 问题,这些 json 有时以数组形式出现,有时以单个对象形式出现。这是我在 json 中看到的示例
它进来的一种方式......
{
"Make": "Dodge",
"Model": "Charger",
"Lines": [
{
"line": "base",
"engine": "v6",
"color": "red"
},
{
"line": "R/T",
"engine": "v8",
"color": "black"
}
],
"Year": "2013"
}
它可以通过另一种方式进入
{
"Make": "Dodge",
"Model": "Charger",
"Lines": {
"line": "base",
"engine": "v6",
"color": "red"
},
"Year": "2013"
}
这是我一直在使用的代码,它在第一种方式下工作并在第二种情况下引发异常。一直在网上搜索实现这一点的方法,但我真的被困住了。
Public Class jsonCar
Public Property make As String
Public Property model As String
Public Property lines As List(Of jsonCarLines)
Public Property year As String
End Class
Public Class jsonCarLines
Public Property line As String
Public Property engine As String
Public Property color As String
End Class
Module Module1
Private Const json As String = "{""Make"":""Dodge"",""Model"":""Charger"",""Lines"": [{""line"":""base"",""engine"": ""v6"",""color"":""red""},{""line"":""R/T"",""engine"":""v8"",""color"":""black""}],""Year"":""2013""}"
'Private Const json As String = "{""Make"":""Dodge"",""Model"":""Charger"",""Lines"": {""line"":""R/T"",""engine"":""v8"",""color"":""black""},""Year"":""2013""}"
Sub Main()
Dim car As jsonCar = JsonConvert.DeserializeObject(Of jsonCar)(json)
Console.WriteLine("Make: " & car.make)
Console.WriteLine("Model: " & car.model)
Console.WriteLine("Year: " & car.year)
Console.WriteLine("Lines: ")
For Each ln As jsonCarLines In car.lines
Console.WriteLine(" Name: " & ln.line)
Console.WriteLine(" Engine: " & ln.engine)
Console.WriteLine(" Color: " & ln.color)
Console.WriteLine()
Next
Console.ReadLine()
End Sub
End Module
我猜这可能需要一个自定义的 JsonConverter,但我不知道如何设置它。
【问题讨论】:
-
我不认为单个对象可以作为具有一个对象的数组写入 JSON?这将大大简化事情。事实上,如果
lines被允许为一个或多个,这可能是正确的方法。否则,您将不得不编写自定义解析器或预处理器来添加必要的[]字符。为什么允许这种设计? -
不幸的是,我无法控制传入的 json 字符串。没有进行字符串操作,我只能坚持我所得到的。我查看了布赖恩提到的问题,但在让它发挥作用时遇到了问题。我认为这里的解决方案在原生 VB 中感觉更直接,这对我来说是额外的 :)
-
@user4543329 由于您无法从重复的问题中获得解决方案,因此我添加了一个答案,说明如何在您的特定情况下使用
SingleOrArrayConverter(Of T)。