予想される出力の例を次に示します (残念ながら私の制御範囲外です)。
{
"the_date":"2013-10-19,"
"users":
{
"john doe":
{
"telephone":"123-456-7890",
"email":"jodoe@server.com"
}
},
{
"jane doe":
{
"telephone":"123-456-7891",
"email":"jadoe@server.com"
}
}
}
オブジェクトのリストを使用して vb.net でデータを作成し、次のようにシリアル化しています。
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Web.Script.Serialization
Public Class the_data
Property the_date As String
Property users As New List(Of KeyValuePair(Of String, List(Of jsuser_data)))
Public Sub New()
the_date = "2013-10-19"
Dim dtUserNames As New DataTable 'hardcoded list for testing only
dtUserNames.Columns.Add("fldUserId", GetType(Integer))
dtUserNames.Columns.Add("fldUserName", GetType(String))
dtUserNames.Rows.Add(100, "john doe")
dtUserNames.Rows.Add(101, "jane doe")
Using reader As New DataTableReader(New DataTable() {dtUserNames})
If reader.HasRows Then
While (reader.Read())
Dim test As New List(Of jsuser_data)
test.Add(New jsuser_data(reader("fldUserId")))
users.Add(New KeyValuePair(Of String, List(Of jsuser_data))(reader("fldUserName").ToString, test)) 'THIS IS THE LINE OF NOTE
End While
End If
End Using
End Sub
End Class
Public Class jsuser_data
Property telephone As String
Property email As String
Public Sub New(theUserId As String)
Dim dtUserData As New DataTable 'hardcoded list for testing only, yes I know it will return the same data for both, I am just simulating my sproc call
dtUserData.Columns.Add("fldUserId", GetType(Integer))
dtUserData.Columns.Add("fldTelephone", GetType(String))
dtUserData.Columns.Add("fldEmail", GetType(String))
dtUserData.Rows.Add(100, "123-456-7890", "jdoe@server.com")
Using reader As New DataTableReader(New DataTable() {dtUserData})
If reader.HasRows Then
While (reader.Read())
telephone = reader("fldTelephone")
email = reader("fldEmail")
End While
End If
End Using
End Sub
End Class
Partial Class Default3
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Dim jsonString As String
Dim test As New the_data()
jsonString = New JavaScriptSerializer().Serialize(test)
Response.Write(jsonString)
End Sub
End Class
いろいろな方法を試した結果、これに近づきました。ただし、次のように「キー」と「値」という単語を出力しています。
{
"the_date":"2013-10-19",
"users":[
{"Key":"john doe",
"Value":[
{"telephone":"123-456-7890","email":"jdoe@server.com"}
]
},
{"Key":"jane doe",
"Value":[
{"telephone":"123-456-7890","email":"jdoe@server.com"}
]
}
]
}
カスタム JSON シリアライザーを作成する必要がありますか?それとも不足しているものがありますか? 私は質問をできる限り徹底的にしようとしましたが、すべての試行と検索で完全に混乱しました。回答にさらにデータが必要な場合はお知らせください. ありがとう!
編集: nicolas-straub-valdivieso の提案に基づいて、「the_data」オブジェクトを次のように変更しました。
Public Class the_data
Property the_date As String
'Property users As New List(Of KeyValuePair(Of String, List(Of jsuser_data)))
Property users As New Dictionary(Of String, List(Of jsuser_data))
Public Sub New()
the_date = "2013-10-19"
Dim dtUserNames As New DataTable 'hardcoded list for testing only
dtUserNames.Columns.Add("fldUserId", GetType(Integer))
dtUserNames.Columns.Add("fldUserName", GetType(String))
dtUserNames.Rows.Add(100, "john doe")
dtUserNames.Rows.Add(101, "jane doe")
Using reader As New DataTableReader(New DataTable() {dtUserNames})
If reader.HasRows Then
While (reader.Read())
Dim test As New List(Of jsuser_data)
test.Add(New jsuser_data(reader("fldUserId")))
users.Add(reader("fldUserName").ToString, test) 'THIS IS THE LINE OF NOTE
End While
End If
End Using
End Sub
End Class
そして今、私の出力は次のとおりです。
{
"the_date":"2013-10-19",
"users":
{
"john doe":[
{"telephone":"123-456-7890",
"email":"jdoe@server.com"}
],
"jane doe":[
{"telephone":"123-456-7890",
"email":"jdoe@server.com"}
]
}
}
それと私が与えられた出力例の唯一の違いは、ユーザーデータの周りの [] であり、それは問題ないかもしれません。