我在 .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;
}
}
}
}