Ajax请求后未定义Javascript对象属性

时间:2019-01-16 16:42:33

标签: javascript jquery json ajax

我进行了ajax调用,该调用从.Net JsonConvert.SerializeObject()调用返回了一个json字符串,该json被自动解析为浏览器中的对象,但是如果没有“ undefined”,我目前无法访问该属性”。

我当前返回的json字符串是(已删除大量字节数组):

"[{\"filename\":\"\",\"size\":6,\"csize\":\"       5.85 KB\",\"extfile\":\"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDA....AAAAAAAAAAAf//Z\"}]"

我已经验证过了,一切都很好。

我的JavaScript是:

function GetItemImage() {
    let kditem = $("#txtItem").text();
    let url = GetUrl();

    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify({
            "kditem": kditem
        }),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            if (data != null) {
                $("#ImgItem").attr("src", "data:image/png;base64,'" + data.extfile + "'");
            }
        }
    });
}

我确保它绝对是一个对象。我试过以data.extfile,data [“ extfile”]的形式访问,将extfile作为字节数组传递,然后访问它,但它总是以“ undefined”的形式出现。无奈之下,我什至尝试访问索引,遍历对象等,但还是一无所获。

我感觉到json字符串中存在一个问题,阻止了它的正确转换,但是我看不到它,因为我对json的使用不多。有人可以指出我要去哪里了吗?

解决方案

JavaScript正在将响应解析为具有单个属性“ data.d”的对象,并解析了data.d并正确创建了对象。

function GetItemImage() {
    let kditem = $("#txtItem").text();
    let url = GetUrl();

    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify({
            "kditem": kditem
        }),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            if (data != null && data.d != null) {
                let imgData = JSON.parse(data.d);
                $("#ImgItem").attr("src", "data:image/png;base64," + imgData[0].extfile);
            }
        }
    });
}

2 个答案:

答案 0 :(得分:1)

基本上,如果您粘贴的string是响应(数据),则在使用JSON.parse()时它会转换为数组,因此您应该这样使用它。

const stringResponse = "[{\"filename\":\"\",\"size\":6,\"csize\":\"       5.85 KB\",\"extfile\":\"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDA....AAAAAAAAAAAf//Z\"}]"


const parsedResponse = JSON.parse(stringResponse);

console.log(parsedResponse)

const entry = parsedResponse[0];

console.log(entry.extfile)

所以基本上,您需要这样做:

data[0].extfile

由于console.log(data)语句返回:

{d: "[{"filename":"","size":6,"csize":" 5.85 KB",…AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//Z"}]"} 

您实际尝试获取的数据包含在接收到的数据的d属性中包含的JSON字符串中。如果要解析字符串然后访问extfile属性,则将拥有数据:

var actualData= JSON.parse(data.d);

var extfile = actualData[0].extfile;

答案 1 :(得分:-1)

不知道这是否有帮助,但在这里是

弃用注意事项:从jQuery 3.0开始,jqXHR.success(),jqXHR.error()和jqXHR.complete()回调已删除。您可以改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。

http://api.jquery.com/jquery.ajax/

该数据也是一个数组,也许获取数组data [0] .extfile中的第一个对象。

我认为它可能会这样修改:

function GetItemImage() {
    let kditem = $("#txtItem").text();
    let url = GetUrl();

    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify({
            "kditem": kditem
        }),
        dataType: "json",
        contentType: "application/json; charset=utf-8"
    }).done(function(data){
        if (data != null) {
            $("#ImgItem").attr("src", "data:image/png;base64,'" + 
            data[0].extfile + "'");
        }
    });
}