Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json反序列化在C window 2012服务器中不起作用_C#_Json_Rest_Serialization - Fatal编程技术网

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

C# Json反序列化在C window 2012服务器中不起作用,c#,json,rest,serialization,C#,Json,Rest,Serialization,我正在尝试反序列化C中RESTWebserive中的json字符串。下面是我使用的jsonstring和类。但在反序列化之后,它在服务器上给出了null/empty值。但在本地,它的工作与预期的一样。那我怎么了 Json字符串 RESTWebService调用 我的班级 在my local with local URL中,我能够反序列化json字符串并将其分配给partnerdata。在服务器windows 2012中,在部署到IIS8.5后,参数值为null/空,反序列化时没有错误。Rest

我正在尝试反序列化C中RESTWebserive中的json字符串。下面是我使用的jsonstring和类。但在反序列化之后,它在服务器上给出了null/empty值。但在本地,它的工作与预期的一样。那我怎么了

Json字符串 RESTWebService调用 我的班级 在my local with local URL中,我能够反序列化json字符串并将其分配给partnerdata。在服务器windows 2012中,在部署到IIS8.5后,参数值为null/空,反序列化时没有错误。Rest WS正在发送预期的响应。和response.error此值已正确反序列化,但参数未反序列化。
那么我怎么了?

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

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

换句话说,您为ParametersCor接收的JSON响应的是一个列表,而不是一个具有各种属性的POCO

更新

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

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); }
    }
}
        PartnerDataDictionary data = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<PartnerDataDictionary>(json);

        string programs = data.Programs;
        Debug.WriteLine(programs);
然后像这样使用它:

        var settings = new DataContractJsonSerializerSettings
        {
            UseSimpleDictionaryFormat = true,
            DataContractSurrogate = new ObjectToPropertyDictionaryArraySurrogate<Paramter>(),
        };
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(PartnerData), settings);

您如何连接到DataContractJsonSerializer?愿意改用Json.NET吗?顺便说一句,您应该将所有可处理的内容(如receiveStream)和响应封装在语句中。
{
    "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;"
        },
{
    "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;""
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); }
    }
}
        PartnerDataDictionary data = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<PartnerDataDictionary>(json);

        string programs = data.Programs;
        Debug.WriteLine(programs);
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 ?? ""));
    }
}
        var settings = new DataContractJsonSerializerSettings
        {
            UseSimpleDictionaryFormat = true,
            DataContractSurrogate = new ObjectToPropertyDictionaryArraySurrogate<Paramter>(),
        };
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(PartnerData), settings);