C# 将json数组中的单个项过帐到.net对象
我在.net中有一个对象,主要用于接收一些json。 它通常工作得非常好,但是当一个数字数组中有一个项目时,json库会将其转换为一个数字,而不是一个包含单个项目的数组。 .net将其作为错误抛出,因为它是单个int32而不是int32数组 我试着转换到json.net,但同样的错误并不奇怪 据我所知,在我的对象中没有其他定义,是吗 下面是我的对象的定义C# 将json数组中的单个项过帐到.net对象,c#,.net,json,C#,.net,Json,我在.net中有一个对象,主要用于接收一些json。 它通常工作得非常好,但是当一个数字数组中有一个项目时,json库会将其转换为一个数字,而不是一个包含单个项目的数组。 .net将其作为错误抛出,因为它是单个int32而不是int32数组 我试着转换到json.net,但同样的错误并不奇怪 据我所知,在我的对象中没有其他定义,是吗 下面是我的对象的定义 public class EnquiryModel { public string Name; public string E
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;
}
不得不改成
foreach (int studio in (Int32[])enq.Studios)
现在这是对象的完整源
如果有某种方法可以概括重复的代码,使其更易于阅读,那就太好了
但这很可能是镀金:)
公共类查询模型
{
公共字符串名称;
公共字符串电子邮件;
公用串电话;
公共字符串作业代码;
公共字符串消息;
公共信息资源;
公共词典选择列表;
//允许将1到多个值的数组作为单个值提交
//而不是数组中的单个项
私人字符串[]收受赌注;
公共对象书局
{
获取{返回BookingQuiries;}
设置
{
if(value.GetType()==typeof(字符串))
{
BookingQuiries=新字符串[]{(字符串)值};
}
else if(value.GetType()==typeof(string[]))
{
BookingQuiries=(字符串[])值;
}
}
}
私人工作室;
公共物品工作室
{
获取{return studios;}
设置
{
if(value.GetType()==typeof(Int32)| | value.GetType()==typeof(Int64))
{
studios=新的Int32[]{(Int32)值};
}
else if(value.GetType()==typeof(Int32[]))
{
studios=(Int32[])值;
}
}
}
私人互联网服务;
公共对象服务
{
获取{return services;}
设置
{
if(value.GetType()==typeof(Int32)| | value.GetType()==typeof(Int64))
{
服务=新的Int32[]{(Int32)值};
}
else if(value.GetType()==typeof(Int32[]))
{
服务=(Int32[])值;
}
}
}
}
我会让变量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;
}
}
}
我觉得您需要编写自己的包装器,它将检查是否存在
T
类型的单个项,并将其转换为newt[]{item}
。您可以使用JSON.NET的JObject类
JObject o = JObject.Parse(response);
并对您正在寻找的特定属性进行评估。向我们展示您是如何构造json对象的。这是最有可能出现问题的地方。是的,如果json不是那样生成的,肯定会更好,但显然这是有效的-因此我必须接受这一点,并且我可以看出这是非常合乎逻辑的这也超出了我的控制范围。我不认为问题与反序列化的方式有关——我认为问题在于json本身,一旦它到达反序列化程序。就像,它会给你一个int,而不是一个int数组。序列化是我无法控制的,在另一个组织的另一个开发人员手中,他告诉我告诉我他使用的json会自动进行“更正”如果提交了一个包含单个项的数组,它会将其转换为单个数字。我已经看到了源代码,并且看到库正在这样做,并且可以复制它。我可以坚持json采用预期的格式,并在客户端强制进行更改,但如果这是一个真正的问题,那么它认为最好的解决方案是接受这个有效的输入这看起来像是一个逻辑解释…谢谢你在这种情况下设置它的代码会保持不变吗,即inquiryModel enq=JsonConvert.DeserializeObject(json);应该是这样,因为该方法应该只分配给属性。记住,如果这有帮助,请标记为“答案”。是的,我非常喜欢这个解决方案,它很优雅,感觉很好-我明天将试用它-并将标记为“答案”,这实际上不起作用,因为发送数组时,typeof()是object[],而不会转换为int[]奇怪。对我来说效果很好。我考虑过这一点,我只是想知道是否有更好的方法来做到这一点,如果有一种方法可以有一个替代的构造函数,一个setter,它可以以某种方式接受一个替代类型的初始化器,这感觉像是正确的解决方案,那么就不会产生大量额外的代码来维护
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;
}
}
}
}
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;
}
}
}
JObject o = JObject.Parse(response);