2012-05-31 4 views
0

У меня есть строка JSON, которую я отправляю на сервер C#. Он содержит массив объектов Event и массив объектов отношений. Объекты отношений описывают отношения таблицы базы данных.Разбор JSON в C#

Однако у меня возникли проблемы с получением данных от JSON на сервере. Объект не существует на сервере deserailize в и JSON.net бросает разбор ошибки при попытке следующее:

// Both throw parse errors 
JObject o = JObject.Parse(Request.Form.ToString()); 
JsonConvert.DeserializeObject<MobileEvents>(Request.Form.ToString()); 

в формате JSON:

{ 
    "CreateEvents": { 
     "Event": [ 
      { 
       "Id": "1", 
       "Subject": "Hire a Clown" 
      } 
     ], 
     "Relationship": [ 
      { 
       "Primary": "Table1", 
       "Secondary": "Table2", 
       "Field": [ 
        { 
         "Table1Id": "1", 
         "Table2Id": [ 
          "101" 
         ] 
        } 
       ] 
      }, 
      { 
       "Primary": "Table1", 
       "Secondary": "Table3", 
       "Field": [ 
        { 
         "Table1Id": "1", 
         "Table3Id": [ 
          "200025" 
         ] 
        } 
       ] 
      }, 
      { 
       "Primary": "Table1", 
       "Secondary": "Table4", 
       "Field": [ 
        { 
         "Table1Id": "1", 
         "Table4Id": [ 
          "3" 
         ] 
        } 
       ] 
      } 
     ] 
    } 
} 
+0

исключение? что означает 'Объект не существует для deserailize в' означает? обычно вы получаете доступ к ключу внутри вашего '.Form', например' this.Request.Form ["myHiddenFieldNAME"] ', чтобы получить значение –

+0

. Проверьте это - http://stackoverflow.com/questions/10815439/deserializing-multiple-json- массивы-of-different-types-of-objects-in-c-sharp –

+0

@Andreas Структура данных создается на стороне клиента, ее не существует на сервере (это имеет смысл?) – JonWells

ответ

3

Request.Form.ToString() бы возвращает результат как «а = 1 & b = 3 ", это определенно не то, что вам нужно.

Если вы передаете значения как отправку формы, вы можете использовать Request.Form["your-key"] для получения значения.

Если вы передаете значения телу http, вы можете использовать new StreamReader(Request.InputStream).ReadToEnd() для получения всей строки JSON.

+0

stream reader подход работал для меня - это превратилось в отличное решение для синтаксического анализа массивных json-объектов в MVC, не пытаясь передать их в качестве параметров в контроллере, а вместо этого непосредственно считывая форму запроса. Genius благодарит! –

2

Я думаю, что у вас есть ошибка в ваш получать ...

Это не

this.Request.Form.ToString(); // see http://stackoverflow.com/questions/7065979/why-is-the-return-value-of-request-form-tostring-different-from-the-result-of for output 

Вместо этого он должен быть

this.Request.Form["myInputNAME"].ToString(); 

Важно - на самом деле использовать name из вашего атрибута по input/select /...-element

Любом: Я хотел бы призвать вас, чтобы использовать, например. <asp:HiddenField runat="server" ID="foo" />. Если у вас есть сервер-контроль вы можете получить доступ к его значению простого делает this.foo.Value на стороне сервера, в то время как на стороне клиента, вы можете получить доступ к полю ввода, как document.getElementById('<%= this.foo.ClientID %>')

+0

Мне интересно, должны ли значения даже быть в форме. Объект создается на клиенте из значений формы AND THEN, отправленных на сервер, поэтому я не уверен, где в этот момент поддерживается сопряжение ввода/значения. – JonWells

+0

О, хорошо, моя ошибка ... Я предположил, что вы трансформируете свой json-объект в строку, а затем сохраните его в 'input'-element - если вы на самом деле этого не делаете, вы должны так ... для преобразования json-object в строку принимает, например, 'JSON.stringify' (https://github.com/douglascrockford/JSON-js) (демонстрация использования @ http://stackoverflow.com/a/912247/57508) –