繁体   English   中英

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

[英]posting single item in json array to .net object

我在.net中有一个对象,主要是为了接收一些json。 它通常工作得非常好,但是当数字数组中有一个项目时,json库会将其转换为单个数字而不是具有单个项目的数组。 .net抛出这个作为一个错误,因为它是一个单一的int32而不是我尝试转换为json.net的int32s数组但是这并没有出乎意料的错误

据我所知,没有办法在我的对象中有另一种定义,是吗?

下面是我的对象的定义

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

}

我会使变量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类型的单个项目,它会将其转换为new T[]{item} 您可以使用JSON.NET的JObject类。

JObject o = JObject.Parse(response);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM