2

予想される出力の例を次に示します (残念ながら私の制御範囲外です)。

{
    "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"}
            ]
        }
}

それと私が与えられた出力例の唯一の違いは、ユーザーデータの周りの [] であり、それは問題ないかもしれません。

4

1 に答える 1

0

KeyValuePair を Dictionary に変更します (質問を解決済みとしてマークできるように回答を追加します)。角括弧は、JSON が構造体を配列として認識できるようにするために必要です (実際、要求されている形式では解析エラーがスローされます。{} (オブジェクト) または [ で囲む必要があるためです)。 ] (配列)。

編集:更新されたコードは見ていませんでした...プロップを からDictionary(of string,List(of jsuser_data))に変更するとDictionary(of string,jsuser_data)、余分なブレースはなくなります。

于 2013-10-19T21:53:04.873 に答える