Я пытаюсь выяснить класс/структуру для обработки следующего формата JSON:

{
"ReturnData": [
    {
        "id": "msg2DoesNotExistName",
        "value": "value 1",
        "userExists": 2 
    },
    {
        "id": "msg2DoesNotExistName",
        "value": "Value 2",
        "userExists": 2 
    } 
],
"SetValue": [
    {
        "id": "msg2DoesNotExistName",
        "value": "value 1" 
    },
    {
        "id": "msg2DoesNotExistName",
        "value": "Value 2" 
    } 
]

}

Я пробовал (только часть SetValue):

    <Serializable()> _
Public Class Stuff
            Public SetValue() As ArrayList
End Class

Public Function TestSerial3(ByVal somevar As String) As String
    Dim s As New JavaScriptSerializer()
    Dim ret As String
    Dim b As New SaveType()
   Dim p1 As New Stuff
    b = New SaveType
    b.id = "ctl00_number_1"
    b.value = "Test1"
    p1.SetValue(0).Add(b)

    b = New SaveType
    b.id = "ctl100_number_2"
    b.value = "Test2"
    p1.SetValue(1).Add(b)

    ret = s.Serialize(p1)

    return ret
 end function

Вот результат: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

Я могу сериализовать внутреннюю часть с помощью структуры, но не могу понять, как включить внешнее имя (ReturnData, SetValue), не прибегая к построению строк:

<Serializable()> _
Public Structure UserExistsType
    Public id As String
    Public value As String
    Public userExists As Integer
End Structure

 Dim b(1) As UserExistsType
 b(0).id = "msg2DoesNotExistName"
 b(0).value = "value 1"
 b(0).userExists = 2
 b(1).id = "msg2DoesNotExistName"
 b(1).value = "Value 2"
 b(1).userExists = 2
 ret = s.Serialize(b)
 ret = "{" & Chr(34) & "ReturnData" & Chr(34) & ":" & ret & "}"

У меня могут быть или не быть данные для ReturnData и SetValue (как минимум один или оба). Я пытаюсь позволить сериализатору обрабатывать большую часть форматирования, не проверяя наличие пустых разделов и массивов с одним элементом. Какие-либо предложения?

1
user652411 10 Мар 2011 в 00:35

1 ответ

Как насчет чего-то подобного (я только закодировал SetValue, вы можете легко добавить ReturnData, используя ту же технику.

По сути, просто оберните два ваших массива во внешний объект (я назвал свой метод MethodCall, потому что так он выглядит).

    Imports System.Runtime.Serialization
    Imports System.Web.script.serialization

    Public Class Form1

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Debug.Print(TestSerial3())
        End Sub


        Public Function TestSerial3() As String
            Dim s As New JavaScriptSerializer()
            Dim ret As String
            Dim r = New MethodCall
            r.SetValue(0) = New SetValue
            With r.SetValue(0)
                .id = "ctl00_number_1"
                .value = "Test1"
            End With


            r.SetValue(0) = New SetValue
            With r.SetValue(0)
                .id = "ctl100_number_2"
                .value = "Test2"
            End With
            ret = s.Serialize(r)

            Return ret
        End Function

    End Class


    <Serializable()> _
    Public Class ReturnData
        Public id As String
        Public value As String
        Public userExists As Integer
    End Class


    <Serializable()> _
    Public Class SetValue
        Public id As String
        Public value As String
    End Class


    <Serializable()> _
    Public Class MethodCall
        Public SetValue(1) As SetValue
        Public returnData(2) As ReturnData
    End Class
0
DarinH 10 Мар 2011 в 23:33
Спасибо - это в основном работает. Dim R AS New MethodCall и вторая пара идентификатор/значение должны использовать индекс 1. Если не считать синтаксических ошибок, мне приходится заранее знать количество элементов. Это хорошее решение, и оно специально обрабатывает пример, который я опубликовал. Начиная с моего исходного сообщения, я перешел к использованию массива и добавлению каждой пары значений (не нужно заранее знать количество элементов). Я все еще использую конкатенацию строк в конце.
 – 
user652411
14 Мар 2011 в 16:53