Я пытаюсь отправить объект JSON через запрос Ajax в ASP.NET MVC. При получении объекта JSON в серверной части он получает объект в строковом формате, как показано ниже.

Как десериализовать его в объект С#?

Код С# ASP.NET MVC:

public string GetLists(string list1)
{
    return JsonConvert.SerializeObject(list1, JsonSetting);
}

Код JavaScript:

button.onclick=()=> {
    let xhr = new XMLHttpRequest()     
    xhr.onreadystatechange = () => {
        if (xhr.readyState == 4 && xhr.status == 200) {
            console.log(xhr.response)
        }
    }
    let list1=[
        {"id":"1a","level":1},
        {"id":"2b","level":14},
        {"id":"3c","level":23}
    ]
    var params ="list1=" + JSON.stringify(list1)
    xhr.open("POST", "/Status/GetLists");
    xhr.setRequestHeader('content-type', "application/x-www-form-urlencoded");
    xhr.send(params);
}

Выход:

[
    {\"id\":\"1a\",\"level\":1},
    {\"id\":\"2b\",\"level\":14},
    {\"id\":\"3c\",\"level\":23}
]
0
AjaiJA 29 Янв 2022 в 21:10

3 ответа

Лучший ответ

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

public ActionResult<List<Item>> GetLists([FromBody] List<item> list)
{
    return Ok(list);
}

Класс

 public class Item
    {
        public string id { get; set; }
        public string level { get; set; }
    }

И аякс

    var params =JSON.stringify(list1);
    xhr.open("POST", "/Status/GetLists");
    xhr.setRequestHeader('content-type', "application/json");
    xhr.send(params);
0
Serge 29 Янв 2022 в 22:06

Вы пытаетесь отправить объект json с неправильным типом содержимого, в вашем случае тип содержимого должен быть application/json, и вам не нужно добавлять " params" + JSON.stringify(list1), поскольку это будет отправлено в теле запроса, вы должны отправить только переменную list1.

xhr.setRequestHeader('content-type', "application/json");
xhr.send(JSON.stringify(list1));

Затем вы сможете десериализовать объект в конечной точке вашего бэкэнда, например:

    public class Item
    {
        public string id { get; set; }
        public string level { get; set; }
    }

    [HttpPost]
    public List<Item> GetLists([FromBody] object value)
    {
        var items = JsonConvert.DeserializeObject<List<Item>>(value.ToString());

        return items;
    }
0
tlucian 29 Янв 2022 в 22:09