我在.net中有一个对象,主要是为了接收一些json。 它通常工作得非常好,但是当数字数组中有一个项目时,json库会将其转换为单个数字而不是具有单个项目的数组。 .net将此作为错误抛出,因为它是单个int32而不是int32s数组 我尝试转换为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;
}
}
}
}
答案 0 :(得分: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;
}
}
}
答案 1 :(得分:1)
我觉得您需要编写自己的包装器,它会检查如果存在T
类型的单个项目,它会将其转换为new T[]{item}
。您可以使用JSON.NET的JObject类。
JObject o = JObject.Parse(response);
并评估o
您要查找的特定属性。