2015-11-04 3 views
12

В настоящее время мы используем маршрут, как это:ASP .NET WebAPI маршрута Данные схемы

[HttpPost] 
[Route("upload")] 
public async Task<dynamic> Upload(dynamic uploadedData) 
{ 
    JArray files = uploadedData.pdfs; 
    // ... 
} 

Вместо того чтобы использовать dynamic, я хотел бы иметь схематичное понимание данных, поступающих в Таким образом, я мог. используйте такую ​​установку, с классом, который определяет схему:

public class UploadRequest : JObject 
{ 
    public JArray pdfs { get; set; } 
} 

[HttpPost] 
[Route("upload")] 
public async Task<dynamic> Upload(UploadRequest uploadedData) 
{ 
    // Now can access the JArray via uploadedData.pdfs directly 
    // ... 
} 

Это правильный подход к этой ситуации? Или существует еще одна стандартная передовая практика для получения данных JSON через ASP.NET WebAPI?

В частности, этот подход в настоящее время не работает. Хотя мой маленький класс схемы расширяет JObject, я получаю сообщение об ошибке из

Словарь параметров содержит недопустимый элемент для параметра «uploadedData» для метода «System.Threading.Tasks.Task`1 [System.Object] Загрузить (UploadRequest) 'в' EditPdfServer.Controllers.PdfFileController '. Словарь содержит значение типа «Newtonsoft.Json.Linq.JObject», но для параметра требуется значение типа «EditPdfServer.Controllers.PdfFileController + UploadRequest».

Итак, во-первых, похоже ли это на правильный подход? Во-вторых, есть ли лучший? В-третьих, почему этот подход не работает? Заранее спасибо.

+0

вы пробовали изменить название uploadedData к PDFS –

+0

могут быть эта ссылка поможет вам HTTP: //weblog.west-wind.com/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing#JObjectandJArrayinASP.NETWebAPI – 111

ответ

5

Я предложил бы использовать атрибут JSONproperty для вас PDFS свойство:

public class UploadRequest : JObject 
{ 
    [JSONProperty("<name of the property in the JSON object>")] 
    public JArray pdfs { get; set; } 
} 

Также обратите внимание на этот пост еще какое-то информацию об атрибуте: JSON.NET deserialize/serialize JsonProperty JsonObject

6

Вы на верном пути.

Вам не нужно слишком беспокоиться о внутренней реализации Newtonsoft.Json. В частности, вы должны стараться избегать использования JObject/JToken/других J-типов, и вам определенно не нужен подкласс JObject.

Ваш класс объекта запроса может быть просто:

public class UploadRequest 
{ 
    [JSONProperty("pdfs")] 
    public SomePDFClass PDFs[] { get; set; } 
} 

Это карта на запрос:

{ 
    "pdfs": [ 
     { <some PDF object here> }, 
     { <some PDF object here> }, 
     { <some PDF object here> } 
    ] 
} 

Параметр Строка JSONPropertyAttribute определяет имя свойства, как представляется, в JSON, поэтому вам не нужно иметь то же имя в коде, что и в JSON. Вы можете изменить имя в коде, пока атрибут все еще использует то же имя, что и документ.

0

Поскольку ваш метод использует пост глагол, вы должны добавить атрибут [FromBody] на своем параметре метода:

[HttpPost] 
public async Task<dynamic> Upload([FromBody] UploadRequest UploadedData) 
{ 
    // Now can access the JArray via uploadedData.pdfs directly 
    // ... 
} 
+1

Стоит упомянуть, что вы можете иметь только один параметр, отмеченный таким образом. Если вам нужно несколько параметров, подумайте о создании объекта-оболочки, содержащего все из них. –

Смежные вопросы