webapi无法识别json列表

时间:2017-05-22 15:02:04

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

我在JSON中获得了一个WebApi2控制器无法识别的对象列表

JSON列表如下:

{
 "FirstObjectType": [{"Name": "the_name"}], 
 "SecondObjectType": [{"Label": "01_obj"}, {"Label": "02_obj"}]
}

Model类是:

public class CompositeObject
{
    [JsonProperty("FirstObjectType")]
    public List<FirstObject> fo { get; set; }

    [JsonProperty("SecondObjectType")]
    public List<SecondObject> so { get; set; }
}

控制器是:

public IHttpActionResult PostList([FromBody] CompositeObject jsonList)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    List<FirstObject> fo_list = jsonList.fo;

    foreach (var item in fo_list)
    {
        db.FirstObject.Add(item);
        db.SaveChanges();
     }

     return StatusCode(HttpStatusCode.OK);
}

当我提交Post动作时,控制器会将CompositeObject jsonList中的两个列表识别为Null

2 个答案:

答案 0 :(得分:0)

您的模型中存在一个问题,即名称未匹配。您必须将模型更新为:

public class FirstObjectType
{
    public string Name { get; set; }
}

public class SecondObjectType
{
    public string Label { get; set; }
}

public class RootObject
{
    public List<FirstObjectType> FirstObjectType { get; set; }
    public List<SecondObjectType> SecondObjectType { get; set; }
}

我假设FirstObjectType包含名称为Name的字符串,而SecondObjectType包含名称为Label的字符串。确保为JSON字符串中的FirstObjectTypeSecondObjectType类的属性使用相同的名称。

答案 1 :(得分:0)

问题出在客户端代码中,因为我错过了在标题部分将内容类型设置为application/json
通过这种方式,WebApi服务器无法以正确的方式识别JSON对象(我认为服务器寻找x-www-form-urlencoded类型)

所以,上面的代码是正确的,但我找到了另一个解决方案

在WebApi控制器中:

using Newtonsoft.Json.Linq;

public IHttpActionResult PostList([FromBody] JObject ReceivedObjectsList)
{           
    var receivedLists = ReceivedObjectsList.Properties();

    List<FirstObject> fo = ReceivedObjectsList["FirstObjectType"].ToObject<List<FirstObject>>();
    List<SecondObject> so = ReceivedObjectsList["SecondObjectType"].ToObject<List<SecondObject>>();

    ...
}