反序列化多个JSON结果

时间:2016-01-09 23:18:35

标签: json vb.net

sed -i 's/^[[:space:]]*echo[[:space:]]*$/ /g'

我设法让这个工作。但是,我无法让它为多种结果而工作。

这是我的JSON输出的一个例子。我怎么回多套? Dim js As New System.Web.Script.Serialization.JavaScriptSerializer Dim json = js.Deserialize(Of jsonTest)(e.Result) With json 'do stuff with object End With Private Class jsonTest Public Artist As String Public Album As String Public Track As String Public Duration As String End Class

1 个答案:

答案 0 :(得分:1)

好的,"多个结果"可能意味着一堆事情。这就是为什么没有人给你一个直接答案的原因。

我认为 - 你在服务器端询问收集和设置的想法。换句话说,我如何返回一个看起来像这样的json结果集(一个json数组):

request for member 'name' in something not a structure or union
request for member 'size' in something not a structure or union|
||=== Build finished: 2 errors, 2 warnings (0 minutes, 0 seconds) ===||

然后,如果我真的想要返回按专辑(或搜索短语或其他任意组)分组的各种曲目,我该如何返回一个看起来像这样的结果集(一个对象数组):

[
{"Artist": "AMR", Album:"I Have No Idea", "Track": "Track 01", Duration: 195},
{"Artist": "AMR", Album:"I Have No Idea", "Track": "Track 02", Duration: 500},
{"Artist": "AMR", Album:"I Have No Idea", "Track": "Track 03", Duration: 400},
...
]

如果这不是你问题的意图,那么请在这里停止阅读。如果是,那么您在VB代码中寻找2个对象:LIST和DICTIONARY。您的班级将保存一个且仅一个曲目的数据。 LIST和DICTIONARY都是语言中的标准集合(数组更智能的性感版本)。

让我们重新排列,重命名一些代码,以便我们使用List(以及一些有意义的名称)...

[
{"The All-American Rejects": [{"Artist":"AMR", ...}, {Artist:"AMR", ...}]}
{"Move Along": [{"Artist":"AMR", ...}, {Artist:"AMR", ...}]}
{"When the Work Comes Down": [{"Artist":"AMR", ...}, {Artist:"AMR", ...}]}
...
]

看看我们如何搞乱你的反序列化代码?

Private Class Track
    Public Property Artist As String
    Public Property Album As String
    Public Property Track As String
    Public Property Duration As String
End Class

'CREATE MY LIST OF OBJECTS HERE
dim Album1 as new List(of Track)
Album1.Add(New Track() with {
    .Artist = "AMR",
    .Album = "The All American Rejects",
    .Track = "Track 01",
    .Duration = 910
})
Album1.Add(New Track() with {
    ... add track info again...
})
... add yet more track info ...

Dim js As New System.Web.Script.Serialization.JavaScriptSerializer
Dim json = js.Deserialize(Of List(of Track))(Album1)
... do whatever you'd like next ...

现在,我们不是反序列化1个结果,而是反序列化结果列表。该代码将为您提供第一个结果集(或多或少)。好。凉。那么我们如何返回多张专辑呢?对于那个小技巧,请使用字典。

要创建曲目列表,vb.net代码类似,但我们使用字典和列表:

js.Deserialize(Of List(of Track))(Album1)

该代码将返回我们概述的第二组json数据,例如10000字以前。

如果这是您想要的方向,那么请查看服务器级别的所有可用集合,并可以查看如何从这些集合创建属性。这些对象是你的大多数真实的"服务器代码将会存在。而且,如果你正确编码它们,将它们序列化(到json,数据库,到XML等)几乎是微不足道的!

首先构建Track类。创建一个类似下面的专辑类,然后填充它,序列化它,看看结果集是什么样的:

'CREATE MY LIST OF OBJECTS HERE

dim results as new Dictionary(of string, of List(of Track))

dim Album1 as new List(of Track)
Album1.Add(New Track() with {
    .Artist = "AMR",
    .Album = "The All American Rejects",
    .Track = "Track 01",
    .Duration = 910
})
Album1.Add(New Track() with {
    ... add track info again...
})
... add yet more track info ...

results.Add("The All American Rejects", Album1)

... do the same thing with the next album ...
results.Add("MoveAlong", Album2)

Dim js As New System.Web.Script.Serialization.JavaScriptSerializer
Dim json = js.Deserialize(Of Dictionary(of string, List(of Track)))(results)
... do whatever you'd like next ...

希望这是你想要的。如果是,那就停在这里。不要再进一步了。向后退一步,read a decent intro to Design Patterns。它会让您习惯使用接口对象以及继承。这将使您编写的任何服务器端代码非常漂亮。喜欢...... 放弃性感。相信我。值得花时间。

祝你好运。