2015-07-24 2 views
2

У меня есть объект JSON, встроенный в javascript, который я хотел бы передать в запрос ajax в VB.Net WebMethod и десериализовать его. Я использую Newtonsoft JSON для десериализации объекта. Похоже, что объект передается более, но когда я пытаюсь десериализации его в объект, я получаю эту ошибку: Error converting value "myid" to type 'AnID.RF.MyIDProfile'.Deserialize JSON в Webmethod от запроса AJAX

Вот Javascript код, я использую:

function test() { 
    var testdata; 

    testdata = "{'data':{'ses':'','profile':{'myid':'myid','username':'User','firstName':'adf','lastName':'lastname','languagePreference':'en'}}}"; 
    $.ajax({ 
     type: "POST", 
     url: "default.aspx/Foo", 
     data: testdata, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     beforeSend: function() { 
     }, 
     success: function(data) { 
      if (data != "") { 
       alert(data.d); 
      } 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      alert(errorThrown); 
     } 

    }) 
} 

Вот код на стороне сервера :

  <System.Web.Services.WebMethod()> _ 
     Public Shared Function Foo(ByVal data As Object) As String 
      Dim jO As JObject = JObject.FromObject(data) 
      Dim sMessage As String = "y" 
      Try 

       Dim results As IList(Of JToken) = jO("profile").Children().ToList() 
       Dim searchResults As IList(Of RF.MyIDProfile) = New List(Of RF.MyIDProfile)() 

       For Each result As JToken In results 
        Dim searchResult As RF.MyIDProfile = JsonConvert.DeserializeObject(Of RF.MyIDProfile)(result.ToString()) 
        searchResults.Add(searchResult) 
       Next 
       Dim stest As String = jO.SelectToken("profile.myid").ToString 
      Catch ex As Exception 
       sMessage = "e" 
      End Try 


      Return sMessage 
     End Function 

     Namespace RF 
      Public Class MyIDProfile 
       Private sMYID As String 
       Private sUSERName As String 
       Private sPrefix As String 
       Private sFirstName As String 
       Private sLastName As String 
       Private slanguagePreference As String 

       Public Property myid() As String 
        Get 
         Return sMYID 
        End Get 
        Set(ByVal value As String) 
         sMYID = value 
        End Set 
       End Property 


       Public Property username() As String 
        Get 
         Return sUSERName 
        End Get 
        Set(ByVal value As String) 
         sUSERName = value 
        End Set 
       End Property 

       Public Property firstName() As String 
        Get 
         Return sFirstName 
        End Get 
        Set(ByVal value As String) 
         sFirstName = value 
        End Set 
       End Property 

       Public Property lastName() As String 
        Get 
         Return sLastName 
        End Get 
        Set(ByVal value As String) 
         sLastName = value 
        End Set 
       End Property 

       Public Property languagePreference() As String 
        Get 
         Return slanguagePreference 
        End Get 
        Set(ByVal value As String) 
         slanguagePreference = value 
        End Set 
       End Property 

      End Class 
     End Namespace 

Если я использую SelectToken («profile.myid») Я могу получить значение без каких-либо проблем. Я не уверен, что я могу делать неправильно, что вызывает эту ошибку. Может ли кто-нибудь взглянуть и посмотреть?

+1

Если вы решили свой вопрос, вы можете (и должны) [ответить сам] (http://meta.stackexchange.com/questions/17845/etiquette -ответ-ваш-собственный-вопрос) вместо того, чтобы редактировать вопрос, чтобы включить ответ. Таким образом, другие узнают, что на вопрос ответили. Благодаря! – dbc

+0

@dbc Прошу прощения. В то время я думал, что было бы лучше просто отредактировать вопрос, а добавить его в качестве ответа. В любом случае решение было перенесено на ответ. – pmb88

ответ

1

Я понял, что случилось. Код, который у меня был, был для десериализации массива объектов, и переданный json-объект не был массивом объектов, из-за которых произошла ошибка. Я снял петлю и заменить его следующим образом:

  <System.Web.Services.WebMethod()> _ 
     Public Shared Function Foo(ByVal data As Object) As String 
       Dim jO As JObject = JObject.FromObject(data) 
       Dim sMessage As String = "y" 
       Try 

        Dim oDetail As RF.MyIDProfile = jO("profile").ToObject(Of RF.MyIDProfile)() 

        Dim sTest2 As String = oDetail.myid 
       Catch ex As Exception 
        sMessage = "e" 
       End Try 


       Return sMessage 
      End Function 
Смежные вопросы