首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Json反序列化在C# window 2012服务器中不起作用

Json反序列化在C# window 2012服务器中不起作用
EN

Stack Overflow用户
提问于 2015-03-31 18:37:43
回答 1查看 406关注 0票数 0

我正在尝试在C#中反序列化来自Rest webserive的json字符串。下面是我使用的jsonstring和类。但是在反序列化之后,它在本地的server.But上给出了null/空值,它的工作方式与预期一样。那我到底是怎么了?

Json字符串

代码语言:javascript
复制
{
    "error": false,
    "parameters": [
        {
            "Programs": "ZZ_UNUSED_EU-01pp-Q669;EU-PPP-O003;ZZ_UNUSED_EU-PPP-CO05;100000;pbse;EU-m110-2007;EU-zz33-L053;EU-zz21-z084;ZZ_UNUSED_EU-01pp-Q875;EU-zz05-L029;ZZ_UNUSED_EU-RAD-003;ZZ_UNUSED_EU-RAD-004;ZZ_UNUSED_EU-RAD-007;ZZ_UNUSED_EU-RAD-012;ZZ_UNUSED_EU-RAD-015;ZZ_UNUSED_EU-zz22-RF21;ZZ_UNUSED_EU-PPP-CO130;ZZ_UNUSED_EU-01pp-Q962;ZZ_UNUSED_EU-01pp-Q963;EU-LandR-COM;EU-01pp-O960;EU-SI-HP-INTL;G_PC_SQ;G_Survey_Inv_TPE-FY11;G_MADO_3Com;G_eLocator_AIS;G_eLocator_ATP;G_eLocator_SCE;G_eLocator_TECI;G_L&R_SCREENED;G_L&R_CASE_OPEN;EU-MDF-Tool;EU-DI-SPT-FLASHPRO;EU-DI-SPT-FLASHPRO-FY11;EU-DI-SPT-FLASHPRO-FY12;G_SPT_PCLM_Prospect;G_SPT_PCLM_Enrolled;SPEC_P1_S1_GOLD_PPS_CAN;G_SPT_Joint_Business_Planning;EU_RET_CE_SCOPE;G_PARTNER_HPQ;ZZ_UNUSED_EU-01pp-O972;SPEC_P1_SERV_SILV_CAN;SPEC_P1_STOR_SILV_CAN;SPEC_P1_NW_SILV_CAN;SPEC_P1_S1_SILV_CAN;PM_P1_PLAT_PART_CAN;PM_P1_SILV_PART_PPS_SM_CAN;SPEC_P1_WK_GOLD_CAN;ZZ_UNUSED_EU-01pp-Q018;"
        },
        {
            "PartnerSubTypes": "G_Tgt_Commercial_T2_Reseller_S;SSP;Supplies Commercial;"
        },
        {
            "CompanyNumber": "29682"
        },
        {
            "PartnerNameHQ": "151070026"
        },
        {
            "SiteIdentifier": "UPP"
        },
        {
            "LastName": "Isaksson"
        },
        {
            "HPInternalUser": "F"
        },
        {
            "PhysAdLine1": "?STRA HAMNEN 1"
        },
        {
            "HPPUserId": "989d35449261b4348e2f477260b1eacc"
        },
        {
            "PartnerName": "Misco AB"
        },
        {
            "PhysAdLine2": ""
        },
        {
            "PhysAdLine3": ""
        },
        {
            "PrimaryChannelSegment": "TDL"
        },
        {
            "HPOrg": "HP Sweden"
        },
        {
            "LastLoginDate": "1426841482160"
        },
        {
            "PartnerPhone": ""
        },
        {
            "PartnerLegalName": "Misco AB"
        },
        {
            "HPOrgs": "Default Organization;HP Sweden;"
        },
        {
            "FirstName": "Joakim"
        },
        {
            "CountryCode": "SE"
        },
        {
            "PreferredLanguageCode": "en"
        },
        {
            "IsPartnerAdmin": "T"
        },
        {
            "PartnerProIdHQ": "1-2GF-564"
        },
        {
            "Accreditations": "G_PM_P1_PLAT_PAR_PP_BU;G_SEGT_EG_SERV_GROWTH;G_SEGT_EG_TS_GROWTH;G_FC_AGR_T2;G_S1_Prospect;G_GPL_P1_PPS_SM;ZZ_UNUSED_EU-zz46-c103;EU-02pp-O138;G_P1_Specialist_Enrolled;G_P1_Specialist_Candidate;G_S1_EXP;G_GPL_P1_EG_BUS;G_GPL_P1_PPS;G_PM_P1_PLAT_PAR;G_PM_P1_BUS_SP_EG_BU;G_GPL_P1_WK;G_P1_Preferred_Candidate;G_P1_Specialist_Enrolled;G_S1_Candidate;G_SEGT_PAN-EG_GROWTH;G_SEGT_EG_NW_GROWTH;G_SEGT_EG_STOR_GROWTH;FY15_P1_STOR_SILV_TGT;FY15_P1_S1_SILV_TGT;FY15_P1_NW_SILV_TGT;G_GPL_P1_S1_P;G_S1_Prospect;FY15_P1_SERV_SILV_TGT;G_PM_P1_BUS_SP_EG;G_PM_P1_PLAT_PAR_PP;G_PM_P1_SILV_PAR_PP_SM;G_SPEC_P1_S1_GOLD_P;G_SPEC_P1_WK_GOLD;ZZ_UNUSED_EU-I&P;ZZ_UNUSED_EU-01pp-Q586;"
        },
        {
            "PhysCountry": "Sweden"
        },
        {
            "PhysCity": "LIDK?PING"
        },
        {
            "PartnerProId": "1-2GF-564"
        },
        {
            "Tier": ""
        },
        {
            "Email": "itg.itg.joakim.isaksson@misco.se"
        },
        {
            "PhysPostalCode": "531 40"
        },
        {
            "PartnerFax": ""
        }
    ]
}

Rest Rest服务调用

代码语言:javascript
复制
//string requestUrl = "http://localhost:8080/RestWSPartner/parameter";
                string requestUrl = "https://upp-itg-moonshot-gslb.austin.hp.com/delegate/esmtokenvalidation/v1?token="+tokenId;
                Log.WriteInfo("requestUrl in RestWS==>" + requestUrl);
                do
                {
                    HttpWebRequest request = HttpWebRequest.Create(requestUrl) as HttpWebRequest;
                    request.Method = "GET";
                    request.ContentType = "application/json; charset=UTF-8";//charset=UTF-8";

                    DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(PartnerData));

                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    Stream receiveStream = response.GetResponseStream();

                    restResponse = jsonSerializer.ReadObject(receiveStream) as PartnerData;
 Log.WriteInfo("restResponse.error ==>" + restResponse.error);
                    Log.WriteInfo("restResponse.message ==>" + restResponse.message);
                    if (restResponse.error.Equals("false"))
                    {
                       // Log.WriteInfo("restResponse===UserId>" + restResponse.parameters.HPPUserId);
                        Log.WriteInfo("restResponse===PartnerProId>" + restResponse.parameters.PreferredLanguageCode);
                        Log.WriteInfo("restResponse===PartnerProId>" + restResponse.parameters.FirstName);
                        Log.WriteInfo("success..  Break");
                        break;
                    }

我的班级

代码语言:javascript
复制
namespace ProductguideNordic
{
    [DataContract]
    public class PartnerData
    {
        [DataMember(Name = "error")]
        public string error { get; set; }

        [DataMember(Name = "message")]
        public string message { get; set; }

        [DataMember(Name = "parameters")]
        public Paramter parameters { get; set; }
    }

    [DataContract]
    public class Paramter
    {
        [DataMember(Name = "Programs")]
        public string Programs { set; get; }

        [DataMember(Name = "PartnerSubTypes")]
        public string PartnerSubTypes { set; get; }

        [DataMember(Name = "CompanyNumber")]
        public string CompanyNumber { set; get; }

        [DataMember(Name = "PartnerNameHQ")]
        public string PartnerNameHQ { set; get; }

        [DataMember(Name = "SiteIdentifier")]
        public string SiteIdentifier { set; get; }

         [DataMember(Name = "LastName")]
        public string LastName { set; get; }

         [DataMember(Name = "HPInternalUser")]
        public string HPInternalUser { set; get; }

         [DataMember(Name = "PhysAdLine1")]
        public string PhysAdLine1 { set; get; }

         [DataMember(Name = "HPPUserId")]
        public string HPPUserId { set; get; }

         [DataMember(Name = "PartnerName")]
         public string PartnerName { set; get; }

         [DataMember(Name = "PhysAdLine2")]
        public string PhysAdLine2 { set; get; }

         [DataMember(Name = "PhysAdLine3")]
        public string PhysAdLine3 { set; get; }

         [DataMember(Name = "PrimaryChannelSegment")]
        public string PrimaryChannelSegment { set; get; }

         [DataMember(Name = "HPOrg")]
        public string HPOrg { set; get; }

         [DataMember(Name = "LastLoginDate")]
        public string LastLoginDate { set; get; }

         [DataMember(Name = "PartnerPhone")]
        public string PartnerPhone { set; get; }

         [DataMember(Name = "PartnerLegalName")]
        public string PartnerLegalName { set; get; }

        [DataMember(Name = "HPOrgs")]
        public string HPOrgs { set; get; }

        [DataMember(Name = "FirstName")]
        public string FirstName { set; get; }

        [DataMember(Name = "CountryCode")]
        public string CountryCode { set; get; }

        [DataMember(Name = "PreferredLanguageCode")]
        public string PreferredLanguageCode { set; get; }

        [DataMember(Name = "IsPartnerAdmin")]
        public string IsPartnerAdmin { set; get; }

        [DataMember(Name = "PartnerProIdHQ")]
        public string PartnerProIdHQ { set; get; }

        [DataMember(Name = "Accreditations")]
        public string Accreditations { set; get; }

        [DataMember(Name = "PhysCountry")]
        public string PhysCountry { set; get; }

        [DataMember(Name = "physCity")]
        public string physCity { set; get; }

        [DataMember(Name = "PartnerProId")]
        public string PartnerProId { set; get; }

        [DataMember(Name = "Tier")]
        public string Tier { set; get; }

        [DataMember(Name = "Email")]
        public string Email { set; get; }

        [DataMember(Name = "PhysPostalCode")]
        public string PhysPostalCode { set; get; }

        [DataMember(Name = "PartnerFax")]
        public string PartnerFax { set; get; }

        [DataMember(Name = "PortalSessionId")]
        public string PortalSessionId { set; get; }

    }
}

在我的本地和本地URL中,我能够反序列化json字符串并将其分配给partnerdata。在服务器(windows 2012)中,在部署到IIS(8.5)后,参数值为空/空,并且反序列化时没有错误。Rest WS发送预期的响应。和restResponse.error,该值已正确反序列化,但参数未反序列化。那我到底是怎么了?

EN

回答 1

Stack Overflow用户

发布于 2015-04-01 02:16:28

在您显示的JSON字符串中,"parameters"是名称/值对的数组:

false {“错误”:"ZZ_UNUSED_EU-01pp-Q669;EU-PPP-O003;ZZ_UNUSED_EU-PPP-CO05;100000;pbse;EU-m110-2007;EU-zz33-L053;EU-zz21-z084;ZZ_UNUSED_EU-01pp-Q875;EU-zz05-L029;ZZ_UNUSED_EU-RAD-003;ZZ_UNUSED_EU-RAD-004;,“参数”:[{“

”:falseZZ_UNUSED_EU-RAD-007;ZZ_UNUSED_EU-RAD-012;ZZ_UNUSED_EU-RAD-015;ZZ_UNUSED_EU-zz22-RF21;ZZ_UNUSED_EU-PPP-CO130;ZZ_UNUSED_EU-01pp-Q962;ZZ_UNUSED_EU-01pp-Q963;EU-LandR-COM;EU-01pp-O960;EU-SI-HP-INTL;G_PC_SQ;G_Survey_Inv_TPE-FY11;G_MADO_3Com;G_eLocator_AIS;G_eLocator_ATP;G_eLocator_SCE;G_eLocator_TECI;G_L&R_SCREENED;G_L&R_CASE_OPEN;EU-MDF-Tool;EU-DI-SPT-FLASHPRO;EU-DI-SPT-FLASHPRO-FY11;EU-DI-SPT-FLASHPRO-FY12;G_SPT_PCLM_Prospect;G_SPT_PCLM_Enrolled;SPEC_P1_S1_GOLD_PPS_CAN;G_SPT_Joint_Business_Planning;EU_RET_CE_SCOPE;G_PARTNER_HPQ;ZZ_UNUSED_EU-01pp-O972;SPEC_P1_SERV_SILV_CAN;SPEC_P1_STOR_SILV_CAN;SPEC_P1_NW_SILV_CAN;SPEC_P1_S1_SILV_CAN;PM_P1_PLAT_PART_CAN;PM_P1_SILV_PART_PPS_SM_CAN;SPEC_P1_WK_GOLD_CAN;ZZ_UNUSED_EU-01pp-Q018;“},{ "PartnerSubTypes":"G_Tgt_Commercial_T2_Reseller_S;SSP;Supplies商用;”},

您的代码试图将参数反序列化为具有多个属性的单个对象,例如:

false {“错误”:"ZZ_UNUSED_EU-01pp-Q669;EU-PPP-O003;ZZ_UNUSED_EU-PPP-CO05;100000;pbse;EU-m110-2007;EU-zz33-L053;EU-zz21-z084;ZZ_UNUSED_EU-01pp-Q875;EU-zz05-L029;ZZ_UNUSED_EU-RAD-003;ZZ_UNUSED_EU-RAD-004;ZZ_UNUSED_EU-RAD-007;,“参数”:{“程序”:

ZZ_UNUSED_EU-RAD-012;ZZ_UNUSED_EU-RAD-015;ZZ_UNUSED_EU-zz22-RF21;ZZ_UNUSED_EU-PPP-CO130;ZZ_UNUSED_EU-01pp-Q962;ZZ_UNUSED_EU-01pp-Q963;EU-LandR-COM;EU-01pp-O960;EU-SI-HP-INTL;G_PC_SQ;G_Survey_Inv_TPE-FY11;G_MADO_3Com;G_eLocator_AIS;G_eLocator_ATP;G_eLocator_SCE;G_eLocator_TECI;G_L&R_SCREENED;G_L&R_CASE_OPEN;EU-MDF-Tool;EU-DI-SPT-FLASHPRO;EU-DI-SPT-FLASHPRO-FY11;EU-DI-SPT-FLASHPRO-FY12;G_SPT_PCLM_Prospect;G_SPT_PCLM_Enrolled;SPEC_P1_S1_GOLD_PPS_CAN;G_SPT_Joint_Business_Planning;EU_RET_CE_SCOPE;G_PARTNER_HPQ;ZZ_UNUSED_EU-01pp-O972;SPEC_P1_SERV_SILV_CAN;SPEC_P1_STOR_SILV_CAN;SPEC_P1_NW_SILV_CAN;SPEC_P1_S1_SILV_CAN;PM_P1_PLAT_PART_CAN;PM_P1_SILV_PART_PPS_SM_CAN;SPEC_P1_WK_GOLD_CAN;ZZ_UNUSED_EU-01pp-Q018;“"PartnerSubTypes":""G_Tgt_Commercial_T2_Reseller_S;SSP;Supplies商业版;”“

换句话说,您为"parameters"接收的JSON对应于一个具有UseSimpleDictionaryFormat = falseList<Dictionary<string, string>>,而不是一个具有各种属性的POCO。

更新

考虑到这是一个使用旧版本.Net的遗留应用程序(可能存在一些配置问题,因为var关键字会导致编译器错误),我建议切换到JavaScriptSerializer,它也是一个内置的.Net组件。按如下方式更改您的数据模型:

代码语言:javascript
复制
public class PartnerDataDictionary
{
    public PartnerDataDictionary()
    {
        this.ParameterDictionary = new Dictionary<string, string>();
    }

    string _error;

    public string error { get { return _error; } set { _error = value; } }

    string _message;

    public string message { get { return _message; } set { _message = value; } }

    [System.Web.Script.Serialization.ScriptIgnore]
    public Dictionary<string, string> ParameterDictionary { get; set; }

    public List<Dictionary<string, string>> parameters
    {
        get
        {
            List<Dictionary<string, string>> dictList = new List<Dictionary<string, string>>();
            foreach (KeyValuePair<string, string> pair in ParameterDictionary)
            {
                Dictionary<string, string> subDict = new Dictionary<string,string>(1);
                subDict[pair.Key] = pair.Value;
                dictList.Add(subDict);
            }
            return dictList;
        }
        set
        {
            if (value == null)
            {
                ParameterDictionary = new Dictionary<string, string>();
                return;
            }
            Dictionary<string, string> dict = new Dictionary<string, string>();
            foreach (Dictionary<string, string> entry in value)
                foreach (KeyValuePair<string, string> pair in entry)
                    dict.Add(pair.Key, pair.Value);
            ParameterDictionary = dict;
        }
    }

    public string GetParameter(string key)
    {
        string value;
        if (ParameterDictionary.TryGetValue(key, out value))
            return value;
        return null;
    }

    public void SetParameter(string key, string value)
    {
        ParameterDictionary[key] = value;
    }

    // Add other properties as needed, marking them as `ScriptIgnore`:
    [System.Web.Script.Serialization.ScriptIgnore]
    public string Programs
    {
        get { return GetParameter("Programs"); }
        set { SetParameter("Programs", value); }
    }
}

我在这里所做的是将JSON作为字典列表读取,然后在setter中将它们组合到字典中以便于使用。

然后,您可以按如下方式读取和写入JSON参数:

代码语言:javascript
复制
        PartnerDataDictionary data = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<PartnerDataDictionary>(json);

        string programs = data.Programs;
        Debug.WriteLine(programs);

原始答案

您可以简单地更改您的PartnerData类,使其具有这样一个字典列表。如果您希望继续使用当前的数据模型,并使用DataContractJsonSerializer,则需要引入一个data contract surrogate来执行转换:

代码语言:javascript
复制
public class ObjectToPropertyDictionaryArraySurrogate<T> : IDataContractSurrogate
{
    class ListDictionaryArray : List<Dictionary<string, string>>
    {
    }

    #region IDataContractSurrogate Members

    public object GetCustomDataToExport(Type clrType, Type dataContractType)
    {
        throw new NotImplementedException();
    }

    public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
    {
        throw new NotImplementedException();
    }

    public Type GetDataContractType(Type type)
    {
        if (type == typeof(T))
            return typeof(ListDictionaryArray);
        return type;
    }

    public object GetDeserializedObject(object obj, Type targetType)
    {
        if (obj is ListDictionaryArray)
        {
            var array = (ListDictionaryArray)obj;
            var dict = array.SelectMany(pair => pair).ToDictionary(pair => pair.Key, pair => pair.Value);
            var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(dict);

            return DataContractJsonSerializerHelper.GetObject<T>(json, new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true });
        }
        return obj;
    }

    public void GetKnownCustomDataTypes(Collection<Type> customDataTypes)
    {
        throw new NotImplementedException();
    }

    public object GetObjectToSerialize(object obj, Type targetType)
    {
        if (obj.GetType() == typeof(T))
        {
            var json = DataContractJsonSerializerHelper.GetJson((T)obj, new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true });
            var dict = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Dictionary<string, string>>(json);
            var array = new ListDictionaryArray();
            array.AddRange(dict.Select(pair => new[] { pair }.ToDictionary(p => p.Key, p => p.Value)));
            return array;
        }
        return obj;
    }

    public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
    {
        throw new NotImplementedException();
    }

    public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)
    {
        throw new NotImplementedException();
    }

    #endregion
}

public static class DataContractJsonSerializerHelper
{
    public static string GetJson<T>(T obj, DataContractJsonSerializer serializer)
    {
        using (var memory = new MemoryStream())
        {
            serializer.WriteObject(memory, obj);
            memory.Seek(0, SeekOrigin.Begin);
            using (var reader = new StreamReader(memory))
            {
                return reader.ReadToEnd();
            }
        }
    }

    public static string GetJson<T>(T obj)
    {
        var serializer = new DataContractJsonSerializer(typeof(T));
        return GetJson(obj, serializer);
    }

    public static string GetJson<T>(T obj, DataContractJsonSerializerSettings settings)
    {
        var serializer = new DataContractJsonSerializer(obj.GetType(), settings);
        return GetJson<T>(obj, serializer);
    }

    public static T GetObject<T>(string json, DataContractJsonSerializer serializer)
    {
        using (var stream = GenerateStreamFromString(json))
        {
            var obj = serializer.ReadObject(stream);
            return (T)obj;
        }
    }

    public static T GetObject<T>(string json)
    {
        var serializer = new DataContractJsonSerializer(typeof(T));
        return GetObject<T>(json, serializer);
    }

    public static T GetObject<T>(string json, DataContractJsonSerializerSettings settings)
    {
        var serializer = new DataContractJsonSerializer(typeof(T), settings);
        return GetObject<T>(json, serializer);
    }

    private static MemoryStream GenerateStreamFromString(string value)
    {
        return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
    }
}

然后像这样使用它:

代码语言:javascript
复制
        var settings = new DataContractJsonSerializerSettings
        {
            UseSimpleDictionaryFormat = true,
            DataContractSurrogate = new ObjectToPropertyDictionaryArraySurrogate<Paramter>(),
        };
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(PartnerData), settings);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29366641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档