1

我在 .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 传递的,所以我的检查是针对两种类型的 or

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

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;
            }
        }
    }

}
4

2 回答 2

2

我会让变量 p[rivate 并通过 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;
            }
        }
    }
于 2013-01-07T15:52:37.563 回答
1

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

JObject o = JObject.Parse(response);

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

于 2013-01-07T15:59:12.833 回答