如何将JArray转换为通用List<>

时间:2018-01-11 16:44:16

标签: c# json.net asp.net-web-api2

通过http Post,我将html FormData发送到我的Web Api2控制器。 FormData包含一个或多个图像以及客户端属性。

我的前端Angular 5服务发送http post(正常工作):

var url = this.host + 'import/MediaUpload';

return this.http.post(url, formData, options)
            .map((result: any) => result._body)
            .catch(this.handleError);

我想将FormData转换为MediaInfo类的通用List(在此MediaUpload()方法下面定义):

public async Task<HttpResponseMessage> MediaUpload(int projectId, int sectionId)
{
    // Check if the request contains multipart/form-data.  
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var provider = await Request.Content.ReadAsMultipartAsync<InMemoryMultipartFormDataStreamProvider>(new InMemoryMultipartFormDataStreamProvider());
    //access form data  
    NameValueCollection formData = provider.FormData;

    List<MediaInfo> listMedia = new List<MediaInfo>();

    //dynamic jsonData = JObject.Parse(formData["MediaInfo"]); // THROWS ERROR
    JArray ary = JArray.Parse(formData["MediaInfo"]);

    foreach (var item in ary) {
        //listMedia.Add((MediaInfo)item);   // ???
        Console.WriteLine(item);
    }

    //access files  
    IList<HttpContent> files = provider.Files;

    HttpContent file1 = files[0];
    var thisFileName = file1.Headers.ContentDisposition.FileName.Trim('\"');            

    // additional file upload code removed, working fine..

    var response = Request.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("DocsUrl", URL);
    return response;
}

public class MediaInfo
{
    public string PatientID { get; set; }
    public string PatientFirstName { get; set; }
    public string PatientLastName { get; set; }
    public string PatientUID { get; set; }
    public string PatientDOB { get; set; }
    public string ExamDate { get; set; }
    public string ExamDevice { get; set; }
    public string SerialNo { get; set; }
    public string Eye { get; set; }
    public int DeviceID { get; set; }
    public int CSIInstanceID { get; set; }
    public int MediaNo { get; set; }
    public string Procedure { get; set; }
    public string FileName { get; set; }
    public int FileSize { get; set; }
}

我以为我可以做类似的事情:

 listMedia.Add((MediaInfo)item;

但我错过了某处的正确转换。

2 个答案:

答案 0 :(得分:3)

您可以使用JObject方法将.ToObject<T>()转换为您选择的类型。

https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JToken_ToObject__1_1.htm

在这种情况下,您希望代码看起来像这样:

listMedia.Add(item.ToObject<MediaInfo>());

答案 1 :(得分:3)

您还可以使用JsonConvert.DeserializeObject将其直接转换为所需类型,前提是formData["MediaInfo"]返回格式良好的JSON。

List<MediaInfo> listMedia = JsonConvert.DeserializeObject<List<MediaInfo>>(formData["MediaInfo"]);