Json.net有多个数据集

时间:2013-06-13 16:14:57

标签: vb.net json.net

我正在使用Json.net的JsonTextWriter从Web服务创建JSON数据对象。我有:

Dim sb As New StringBuilder()
Dim sw As New StringWriter(sb)
Dim writer As JsonWriter = New JsonTextWriter(sw)

If ds.Tables(0).Rows.Count > 0 Then

    writer.WriteStartObject()
    writer.WritePropertyName("authors")
    writer.WriteStartArray()
    For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
        writer.WriteStartObject()
        writer.WritePropertyName("key")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("CoAuthorID"))
        writer.WritePropertyName("text")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("CoAuthorName").ToString)
        writer.WritePropertyName("program")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("program").ToString)
        writer.WritePropertyName("number")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("n").ToString)
        writer.WriteEndObject()
    Next
    writer.WriteEndArray()
    writer.WriteEndObject()
End If

但现在我想添加第二个表,例如

writer.WriteStartObject()
writer.WritePropertyName("pubs")
writer.WriteStartArray()
For i As Integer = 0 To ds.Tables(1).Rows.Count - 1
    writer.WriteStartObject()
    writer.WritePropertyName("pmid")
    writer.WriteValue(ds.Tables(1).Rows(i).Item("pmid"))
    writer.WritePropertyName("text")
    writer.WriteValue(ds.Tables(1).Rows(i).Item("Reference").ToString)
    writer.WriteEndObject()
Next
writer.WriteEndArray()
writer.WriteEndObject()

我希望能够处理客户端上的数据,例如JSONData.authorsJSONData.pubs。当我使用一个数据表时,一切都很好,但如果我合并teo,那么我无法读取数据。它似乎缺少两个JSON对象之间的逗号。如果我手动添加它,它会窒息。我将“假设”我在两个数据表之间缺少一行代码,但我不确定那是什么。任何帮助表示赞赏。我认为它可能与WriteStartConstructor有关,但我真的不知道。

1 个答案:

答案 0 :(得分:2)

您的pubs数组应该是根对象上的属性,而不是新对象。如果您只是按原样添加代码,那么您基本上就是编写如下所示的JSON:

{"authors":[...]}{"pubs":[...}}

您可能已经注意到,您只有两个不同的对象,分别具有authorspubs属性。就像那样,它不是一个有效的JSON字符串。

你可能想要像这样构建你的JSON:

writer.WriteStartObject()
If ds.Tables(0).Rows.Count > 0 Then
    writer.WritePropertyName("authors")
    writer.WriteStartArray()
    For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
        writer.WriteStartObject()
        writer.WritePropertyName("key")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("CoAuthorID"))
        writer.WritePropertyName("text")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("CoAuthorName").ToString)
        writer.WritePropertyName("program")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("program").ToString)
        writer.WritePropertyName("number")
        writer.WriteValue(ds.Tables(0).Rows(i).Item("n").ToString)
        writer.WriteEndObject()
    Next
    writer.WriteEndArray()
End If
If ds.Tables(1).Rows.Count > 0 Then
    writer.WritePropertyName("pubs")
    writer.WriteStartArray()
    For i As Integer = 0 To ds.Tables(1).Rows.Count - 1
        writer.WriteStartObject()
        writer.WritePropertyName("pmid")
        writer.WriteValue(ds.Tables(1).Rows(i).Item("pmid"))
        writer.WritePropertyName("text")
        writer.WriteValue(ds.Tables(1).Rows(i).Item("Reference").ToString)
        writer.WriteEndObject()
    Next
    writer.WriteEndArray()
End If
writer.WriteEndObject()