将json数组中的单个项目发送到.net对象

本文关键字:net 对象 项目 单个 json 数组 | 更新日期: 2023-09-27 17:50:58

我在。net中有一个对象,主要是为了接收一些json。它通常工作得很好,但是当数字数组中有一个单独的项目时,json库将其转换为一个单独的数字,而不是一个只有一个项目的数组。.net将此作为错误抛出,因为它是单个int32而不是int32数组我尝试转换到json.net,但这并不奇怪相同的错误

在我看来没有办法在我的对象中有一个替代的定义,是吗?

下面是对象 的定义
public class EnquiryModel
{
    public string Name;
    public string Email;
    public string Phone;
    public string JobCode;
    public string Message;
    public int ReferralSource;
    public Dictionary<string, int> PickList;
    public int[] Studios;
    public int[] Services;
    public string[] BookingEnquiries;
}

,这里是我用来填充它的代码

using Newtonsoft.Json;
EnquiryModel enq = JsonConvert.DeserializeObject<EnquiryModel>(json);

之前我使用

using System.Web.Script.Serialization;
JavaScriptSerializer j = new JavaScriptSerializer();
EnquiryModel enq = j.Deserialize<EnquiryModel>(json);

它们都产生相同的错误

不知道避免这个问题的最好方法是什么

在客户端序列化时,包含单个项的数组被转换为单个数字我也不知道为什么:)?

更新为已解决

标记为下面解决方案的答案非常有效-谢谢:)

有几个我认为值得分享的小改动

首先,我发现它是作为Int64传递的,所以我的检查是针对两种类型的或

我也有一些代码使用这个对象,因为公共变量不再是一个数组,而是一个对象,我必须添加一个强制转换的用法,所以:

foreach (int studio in enq.Studios)

必须改成

foreach (int studio in (Int32[])enq.Studios)

现在是对象的完整源代码如果有一些方法可以泛化重复的代码,使其更容易阅读,那就太好了但这很可能是镀金的:)

public class EnquiryModel
{
    public string Name;
    public string Email;
    public string Phone;
    public string JobCode;
    public string Message;
    public int ReferralSource;
    public Dictionary<string, int> PickList;
    //allow the arrays of 1 to many values to be submitted as a single value
    // instead of a single item in an array
    private string[] bookingEnquiries;
    public object BookingEnquiries
    {
        get { return bookingEnquiries; }
        set
        {
            if (value.GetType() == typeof(string))
            {
                bookingEnquiries = new string[] { (string)value };
            }
            else if (value.GetType() == typeof(string[]))
            {
                bookingEnquiries = (string[])value;
            }
        }
    }
    private int[] studios;
    public object Studios
    {
        get { return studios; }
        set
        {
            if (value.GetType() == typeof(Int32) || value.GetType() == typeof(Int64))
            {
                studios = new Int32[] { (Int32)value };
            }
            else if (value.GetType() == typeof(Int32[]))
            {
                studios = (Int32[])value;
            }
        }
    }
    private int[] services;
    public object Services
    {
        get { return services; }
        set
        {
            if (value.GetType() == typeof(Int32) || value.GetType() == typeof(Int64))
            {
                services = new Int32[] { (Int32)value };
            }
            else if (value.GetType() == typeof(Int32[]))
            {
                services = (Int32[])value;
            }
        }
    }
}

将json数组中的单个项目发送到.net对象

我将使变量p[private]并通过getter和setter公开它们。在setter中,您可以计算发送进来的属性并对其进行适当的设置。

    private Int32[] numbers;
    public object Numbers
    {
        get { return numbers; }
        set
        {
            if (value.GetType() == typeof(Int32))
            {
                numbers = new Int32[] { (Int32)value };
            }
            else if (value.GetType() == typeof(Int32[]))
            {
                numbers = (Int32[])value;
            }
        }
    }

我觉得您需要编写自己的包装器,它将检查是否存在类型为T的单个项目,并将其转换为new T[]{item}。您可以使用JSON。. NET的JObject类。

JObject o = JObject.Parse(response);

和评估o为您正在寻找的特定属性。