VB.NET JSON объект проблема - PullRequest
1 голос
/ 24 июня 2011

ОБНОВЛЕНИЕ: Так что я понял! Все, что мне нужно было сделать, это использовать jQuery.parseJSON();, и оно преобразовало строку JSON в объект JSON. Вот обновленный код:

$.ajax({
  type: "POST",
  url: "GetEEs.aspx/GetNextEEs",
  data: "{recordID:" + lastItem + "}",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function (msg, textStatus, jqXHR) {
    var jObject = jQuery.parseJSON(msg.d);
    ddl.length = 0;
    $.each(jObject.d, function () {
      $.each(this, function (index, item) {
        addItemToDDL(ddl, item.Display, item.Value);
      });
    });
  },
  error: function (xhr, ajaxOptions, thrownError) {
    alert(xhr.status);
    alert(thrownError);
  }
});

Хорошо, я написал функцию для запроса таблицы и возврата набора данных, а затем преобразовал его в JSON, чтобы страница могла его использовать. Функция ниже:

    <WebMethod()> _
    Public Shared Function GetNextEEs(ByVal recordID As Integer) As ArrayList
        If Not recordID.Equals(0) Then
            Dim sql As String = "SELECT TOP 500 * FROM cbotest WHERE ID > " & recordID
            Dim arr As New ArrayList

            Using dr As SqlDataReader = Mangrove.SqlHelper.ExecuteReader("...")
                While dr.Read()
                    arr.Add(New ArrayList() From { _
                     New With { _
                      Key .Value = dr("code").ToString, _
                      Key .Display = dr("description").ToString _
                     }
                    })
                End While
            End Using

            Return arr
        Else
            Throw New ApplicationException("Invalid Record ID")
        End If
    End Function

Функция отлично работает в .Net 4, но я не могу использовать ее с .Net 2. Поэтому я нашел объект JSON.Net с именем Jayrock . Я изменил свою функцию, чтобы использовать его, и все работает. Вот исправленная функция:

<WebMethod()> _
Public Shared Function GetNextEEs(ByVal recordID As Integer) As String
    If Not recordID.Equals(0) Then
        Dim sql As String = "SELECT TOP 500 * FROM cbotest WHERE ID > " & recordID
        Dim json As JsonObject = New JsonObject()
        Dim items As JsonArray = New JsonArray()

        Using dr As SqlDataReader = Mangrove.SqlHelper.ExecuteReader("...")
            While dr.Read()
                Dim item As JsonArray = New JsonArray()
                Dim itemArr As JsonObject = New JsonObject()

                itemArr.Add("Value", dr("code").ToString)
                itemArr.Add("Display", dr("description").ToString)

                item.Add(itemArr)
                items.Add(item)
            End While
        End Using

        json.Add("d", items)

        Using writer As JsonWriter = New EmptyJsonWriter()
            json.Export(writer)
            Return json.ToString
        End Using
    Else
        Throw New ApplicationException("Invalid Record ID")
    End If
End Function

Единственная проблема - когда он возвращает JSON, страница не может его проанализировать.

Вот пример выходов из обеих функций:

Первая версия: [object Object],[object Object],[object Object], ...

Пересмотренная версия: {"d":[[{"Value":"501","Display":"Record Number 501"}],[{"Value":"502","Display":"Record Number 502"}], ...

Как видите, пересмотренная версия возвращает фактическую строку (которая содержит правильные данные), где в качестве первой версии возвращен объект JSON. Я знаю, что это из-за функции, возвращаемой как String, но я не могу понять, как вернуть объект JSON, используя исправленный код.

У кого-нибудь есть идея, как это сделать, или лучшее решение? Я в тупике! Также, пожалуйста, помните, что это для .Net 2 (отстой, я знаю: /)

Спасибо, что уделили время!

EDIT Вот некоторый код на стороне клиента, который я использую:

$.ajax({
  type: "POST",
  url: "GetEEs.aspx/GetNextEEs",
  data: "{recordID:" + lastItem + "}",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function (msg, textStatus, jqXHR) {
    //alert(msg.d);
    document.getElementById('lbl').innerHTML = msg.d;
    ddl.length = 0;
    $.each(msg.d, function () {
      $.each(this, function (index, item) {
        addItemToDDL(ddl, item.Display, item.Value);
      });
    });
  },
  error: function (xhr, ajaxOptions, thrownError) {
    alert(xhr.status);
    alert(thrownError);
  }
});

У меня был alert(item); внутри самой внутренней петли. Он проходил буква за строкой.

1 Ответ

0 голосов
/ 25 июня 2011
$.ajax({
  type: "POST",
  url: "GetEEs.aspx/GetNextEEs",
  data: "{recordID:" + lastItem + "}",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function (msg, textStatus, jqXHR) {
    var jObject = jQuery.parseJSON(msg.d);
    ddl.length = 0;
    $.each(jObject.d, function () {
      $.each(this, function (index, item) {
        addItemToDDL(ddl, item.Display, item.Value);
      });
    });
  },
  error: function (xhr, ajaxOptions, thrownError) {
    alert(xhr.status);
    alert(thrownError);
  }
});
...