【问题标题】:Parse incoming JSON (from javascript Ajax post) using Web API controller使用 Web API 控制器解析传入的 JSON(来自 javascript Ajax 帖子)
【发布时间】:2016-05-18 14:21:04
【问题描述】:

我有以下脚本

<script>
    $(window).load(function () {
        var model = [
            {
                "reservation":
                {
                    "ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
                    "clubId": 70656,
                    "courtNumber": 1,
                    "crud_name": "add",
                    "reservationtype_name": "toernooi"
                }
            }, 
            {
                "reservation":
                {
                    "ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
                    "clubId": 70656,
                    "courtNumber": 1,
                    "crud_name": "update",
                    "reservationtype_name": "toernooi"
                }
            }
        ];
        alert(JSON.stringify(model));
        $.ajax({
            type: "POST",
            data: JSON.stringify(model),
            url: "http://localhost:59854/api/incomingapi",
            contentType: "application/json",
            dataType: 'json',
            success: function (result) { },
            error: function (errResult) { }
        });
    });
</script>

我有以下控制器

public string Post(HttpRequestMessage request)
{
    string jsonString1 = request.Content.ReadAsStringAsync().Result;
    JavaScriptSerializer json_serializer = new JavaScriptSerializer();
    var v1 = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
    var v2 = json_serializer.DeserializeObject(jsonString1);
    JObject jobj1 = JObject.Parse("{ \"test\":\"some data\" }");
    JObject jobj2 = JObject.Parse(jsonString1);
    return "";
}

v1jobj1 用于测试。 jsonString1 填充了值。 v2 在运行时填充了值。

但是我只有4种方法

  • 等于()
  • GetHashCode()
  • GetType()
  • ToString()

在我输入代码时可用...

我必须将 jsonString1 中的值转换为类型保留的集合或一些我可以循环或使用 linq 的方法,但是当我尝试类似的方法时,值不会被填充(一切都是null 或 0)。

例如,下面我可以循环并使用 linq 但未填充值(是 0 和 0 而不是 70656 和 1 ):

var parsedVar = json_serializer.Deserialize<ICollection<ReservationModelForJson>>(jsonString1);
var clubId = parsedVar.First().clubId;//is 0 should be 70656
var courtNumber = parsedVar.First().courtNumber;//is 0 should be 1

谁能解决这个问题?非常感谢!

public class ReservationModelForJson
{
    public string ticketId { get; set; }
    public int clubId { get; set; }
    public int courtNumber { get; set; }
    public string crud_name { get; set; }
    public string reservationtype_name { get; set; }
}

答案/解决方案:

我在下面添加了类

public class JsonBinder
{
    public ReservationModelForJson reservation { get; set; }
}

并将我的控制器更改为

public string Post(IEnumerable<JsonBinder> reservations)
{
    int clubId = reservations.First().reservation.clubId;
    int courtNumber = reservations.First().reservation.courtNumber;
    return "tnkx!";
}

【问题讨论】:

  • 只需创建一个对象供Post() 方法接受,然后传递实际的json 对象而不是传递JSON.stringify()

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


【解决方案1】:

这是因为您的反序列化失败。您尝试在服务器端反序列化的内容与您的 json 模型不匹配。当前,您尝试反序列化具有属性名称保留的对象列表(这是具有预期属性的对象)。要修复,请像下面这样改造您的 json。

 var model = [
        {
                "ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
                "clubId": 70656,
                "courtNumber": 1,
                "crud_name": "add",
                "reservationtype_name": "toernooi"
        }, 
        {
                "ticketId": "782274b8-10d9-444c-8f05-3117853e3ee0",
                "clubId": 70656,
                "courtNumber": 1,
                "crud_name": "update",
                "reservationtype_name": "toernooi"
        }
    ];

或者创建一个类,其对象属性名称为 reservation 具有预期的属性、ticketId、clubId 等...

【讨论】:

  • 谢谢大家!我无法更改 Json 格式,所以最后一个选项对我有用!
【解决方案2】:

这应该可行。代替 Post 方法中的 HttpRequestMessage 参数,使用 ReservationModelForJson 的集合。此外,您可能需要删除 JSON.stringify(model),然后传递模型。

public string Post(IEnumerable<ReservationModelForJson> reservations)
{
   //Now you can work with the reservations collection
   var firstRes = reservations.FirstOrDefault(); 
}

【讨论】:

  • 我也相信这应该有效,但不知何故它没有。我尝试只传递model 并使用JSON.stringify(model)
【解决方案3】:

试试这个:

json_serializer.Deserialize<List<ReservationModelForJson>>(jsonString1);

而您的courtNumber 等属性位于reservation 对象中,因此例如您应该使用parsedVar.First().courtNumber;。在这种情况下,ReservationModelForJson 的结构很重要。

【讨论】:

  • 已经试过了,不行...还试过IEnumerableICollection
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2011-04-30
  • 2013-02-25
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多