1

私は主にjsonを受信する目的で.netにオブジェクトを持っています。通常は非常にうまく機能しますが、数値の配列に単一の項目がある場合、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

変数をプライベートにして、ゲッターとセッターを介して公開します。セッターでは、送信されたプロパティを評価し、適切に設定できます。

    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 に答える