【问题标题】:Issue deserializing an array of javascript object in c#在 c# 中反序列化 javascript 对象数组的问题
【发布时间】:2017-09-27 14:30:01
【问题描述】:

我在将 javascript 数组反序列化为 c# List 类时遇到问题,已阅读有关 SO 的其他答案,但没有解决我的问题。

对象数组

"{\"Id\":\"87\",\"Name\":\"Product x\",\"Cost\":200000,\"Tag\":\"Product_x\"},
 {\"Id\":\"88\",\"Name\":\"Product y\",\"Cost\":100000,\"Tag\":\"Product_y\"}"

产品以 FormData 形式发布,因此我以上述格式接收它们。

产品型号

public class Product {
    public int Id {get; set;}
    public String Name {get; set;}
    public decimal Cost {get; set;}
    public string Tag {get; set;}
 }

我有一个 ViewModel

public class ProductViewModel {
    [JsonProperty("SerializedProducts")]
        public string SerializedProducts{ get; set; } // So this model returns the array of objects above

    // Deserializes the SerializedProduct and converts to List of Products.
        public List<Product> Products
        {
            get { return JsonConvert.DeserializeObject<List<Product>>(SerializedProducts); } 
            set { }
        }
 }

错误信息 无法将当前 JSON 对象(例如 {\"name\":\"value\"})反序列化为类型 'System.Collections.Generic.List `1[Product]',因为该类型需要 JSON 数组(例如 [1, 2,3]) 正确反序列化。

我观察到的 我希望 SerializedProducts 返回一个像这样的对象数组

"[{\"Id\":\"87\",\"Name\":\"Product x\",\"Cost\":200000,\"Tag\":\"Product_x\"},
 {\"Id\":\"88\",\"Name\":\"Product y\",\"Cost\":100000,\"Tag\":\"Product_y\"}]"

我需要帮助。谢谢!

更新

Javascript 帖子

function extractAndFormatFormData(formId) {
    var formData = new FormData();
    var products = [];
    var product = new Product(Id, Name, Cost, Tag);

    // Add product to array
    products.push(JSON.stringify(product));

    // Add products to form
    formData.append('SerializedProducts', products);

    // I'm also attaching a txt file. This is not an issue at the moment
    formData.append('UploadedForm', uploadedFile);

    return formData;
}

Ajax 帖子

var formatedFormData = extractAndFormatFormData(formId);
        var url = '/Dashboard/provision/';
        $.ajax({
            url: url,
            data: formatedFormData,
            type: 'POST',
            datatype: 'json',
            contentType: false,
            processData: false,
            cache: false,
            success: function (data) {
                $('#planDetails').append(data);
            },
            error: function (err) {
                console.log(err);
            }
        });

【问题讨论】:

  • “对象数组”不是一个,JSON 无效。要成为一个数组,它将在[...] 内(在最后的示例中)。因此,如果您真的没有收到它,请添加方括号。
  • 谢谢@T.J.克劳德,这也是我所怀疑的。我该如何解决。我已经更新了我的问题以包括已发布的表格。你能帮忙吗?
  • 看起来克莱顿已经解决了。 :-)
  • 哦,是的,伟大的先生。也感谢您指出实际问题。
  • 建议您也参考this answer。将您的数据字符串化并将其作为 FormData 进行传感,然后在模型属性中再次反序列化它是不必要的..

标签: javascript c# asp.net-mvc deserialization form-data


【解决方案1】:

在 Javascript 中,在 products 数组上使用 stringfy,而不是在数组项中。

代码:

function extractAndFormatFormData(formId) {
    var formData = new FormData();
    var products = [];
    var product = new Product(Id, Name, Cost, Tag);

    // Add product to array
    products.push(product);

    // Add products to form
    formData.append('SerializedProducts', JSON.stringify(products));

    // I'm also attaching a txt file. This is not an issue at the moment
    formData.append('UploadedForm', uploadedFile);

    return formData;
}

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多