2016-06-09 1 views
0

Я пытаюсь получить мой веб-сервис, написанный на .NET MVC5, для возврата JSON, который я могу использовать в приложении iOS. Я думал, что я уже успел, но более внимательно посмотрел на возвращенные данные - и имейте в виду, что это для меня все ново, так что простите мою терминологию - похоже, что я получаю JSON-массив, а не объект JSON ,Веб-сервис Возврат JSON Array не JSON Object

Это, я думаю, вызывает проблемы, когда я следую онлайн-учебным пособиям, в которых показано, как конвертировать объекты JSON в словари в Swift для отображения в приложении. Как вы можете видеть из выходного образца ниже, мой JSON начинается с [{"FirstName":"John"..., эффективно запускать прямо в массив людей, когда я думаю, что я хочу, чтобы начать что-то вроде {"People":[{"FirstName":"John"...

Как я могу получить JSON вернулся, чтобы быть объект, а не просто массив людей? Я надеюсь, что я почти там и, возможно, просто нужно что-то изменить?

Модель:

public class PersonModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DepartmentName { get; set; } 

    public IEnumerable<PhoneNumberModel> PhoneNumbers { get; set; } 
} 

Контроллер:

public class PersonController : ApiController 
{ 
    public IEnumerable<PersonModel> GetAllPersons() 
    { 
     List<PersonModel> person; 
     using (var context = new ContactsContext()) 
     { 
      person = context.People.Include("PhoneNumbers.PhoneNumberType1").ToList() 
       .Select(p => new PersonModel 
       { 
        FirstName = p.FirstName, 
        LastName = p.LastName, 
        DepartmentName = p.Department1.Name, 
        PhoneNumbers = p.PhoneNumbers.Select(x => new PhoneNumberModel 
        { 
         PhoneNumberTypeName = x.PhoneNumberType1.Description, 
         TelephoneNumber = x.PhoneNumber1 
        }) 
       }).ToList(); 
     } 

     return person; 
    } 
} 

Выход:

[{ 
"FirstName": "John", 
"LastName": "Smith", 
"DepartmentName": "Accounts", 
"PhoneNumbers": [{ 
    "PhoneNumberTypeName": "Office", 
    "TelephoneNumber": "12345" 
    }, { 
    "PhoneNumberTypeName": "Mobile", 
    "TelephoneNumber": "54321" 
    }] 
}, { 
    "FirstName": "Jane", 
    "LastName": "Harris", 
    "DepartmentName": "HR", 
    "PhoneNumbers": [{ 
     "PhoneNumberTypeName": "Mobile", 
     "TelephoneNumber": "98765" 
    }] 
}] 
+2

Сгенерированный JSON верен. Тип возврата для Action - это 'IEnumerable ', который является коллекцией, поэтому он всегда будет преобразован в массив в JSON. –

ответ

2

Ваш метод GetAllPersons возвращает IEnumerable (т. набор PersonModel), поэтому он будет сериализован для его JSON-аналога (т. е. коллекции объектов JSON). Если вы хотите обернуть коллекцию в объекте JSON, это станет следующим:

{ 
    "People": [ 
     { 
     "FirstName": "trashr0x", 
     "LastName": "StackOverflow", 
     "DepartmentName": "MVC", 
     "PhoneNumbers": [ 
      { 
       "PhoneNumberTypeName": "Work", 
       "TelephoneNumber": "123456" 
      } 
     ] 
     } 
    ] 
} 

...то просто сделать то же самое с вашей моделью в C#: сделать PeopleModel класс, имеющим People свойства типа IEnumerable<PersonModel>:

public class PeopleModel 
{ 
    public IEnumerable<PersonModel> People { get; set; } 
} 

Вы можете создать экземпляр PeopleModel экземпляра, установите PeopleModel.People ваши IEnumerable<PersonModel> и return PeopleModel вместо этого.

+0

Это сделало трюк, спасибо! Можно ли ожидать, что это приведет к возврату данных гораздо медленнее? Потому что это! –

+0

Эй, добро пожаловать. Обычно это не должно - я не могу сказать, не взглянув на вашу реализацию. – trashr0x

-1

Upd ованные


ответ ниже не имеет значения, как указывал Дауд Алан в комментарии ниже.

Вместо того, чтобы возвращаться, попробуйте вернуться ниже.

return JsonConvert.SerializeObject(person); 

Вам также нужно будет отрегулировать возвращаемый тип и на контроллере.

Для этого вам может потребоваться добавить необходимый пакет для этого через диспетчер пакетов .

Install-Package Newtonsoft.Json 
+1

Web API автоматически преобразует объект в JSON - вам не нужен JsonConvert.SerializeObject (person); - Это вызовет проблемы, когда вам скажут, что вам нужен API для создания формата данных XML и JSON - проблема здесь в том, что возвращаемый тип действия ничего не стоит –

+0

@DawoodAwan правильно, я не обратил внимание на ApiController в вопросе. Я отредактирую свой ответ выше. Я планировал ответить на это как комментарий, но мои очки в настоящее время не позволяют мне это сделать. – Zephire

0

Использование HttpResponseMessage

public HttpResponseMessage GetAllPersons() 
{ 
    List<PersonModel> person; 
    using (var context = new ContactsContext()) 
    { 
     person = context.People.Include("PhoneNumbers.PhoneNumberType1").ToList() 
      .Select(p => new PersonModel 
      { 
       FirstName = p.FirstName, 
       LastName = p.LastName, 
       DepartmentName = p.Department1.Name, 
       PhoneNumbers = p.PhoneNumbers.Select(x => new PhoneNumberModel 
       { 
        PhoneNumberTypeName = x.PhoneNumberType1.Description, 
        TelephoneNumber = x.PhoneNumber1 
       }) 
      }).ToList(); 
    } 
    HttpResponseMessage response = 
    Request.CreateResponse(HttpStatusCode.OK, new { People = person }); 
    return response; 
    } 

Использование IHttpActionResult

public IHttpActionResult GetAllPersons() 
    { 
     List<PersonModel> person; 
     using (var context = new ContactsContext()) 
     { 
      person = context.People.Include("PhoneNumbers.PhoneNumberType1").ToList() 
       .Select(p => new PersonModel 
       { 
        FirstName = p.FirstName, 
        LastName = p.LastName, 
        DepartmentName = p.Department1.Name, 
        PhoneNumbers = p.PhoneNumbers.Select(x => new PhoneNumberModel 
        { 
         PhoneNumberTypeName = x.PhoneNumberType1.Description, 
         TelephoneNumber = x.PhoneNumber1 
        }) 
       }).ToList(); 
     } 
     return Ok(new { People = person }); 
    } 

увидеть это link для получения дополнительной информации