如何解析JSON字符串,它可以是两个不同的强类型对象之一?

时间:2011-11-24 09:33:33

标签: c# json

背景

我正在调用一个返回JSON字符串的Web服务方法。此字符串可以是ASConInfoASErrorResponse类型。

问题:

使用DataContractJsonSerializer,如何将返回的JSON字符串转换为其中一个对象?

提前致谢

我尝试了以下技术,但它不起作用:

    public static object test(string inputString)
    {
        object obj = null;
        using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(inputString)))
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(object));
            obj = ser.ReadObject(ms) as object;
        }
        return obj;
    }

  [WebMethod]
    public string TypeChecker()
    {
        string str = "{\"Error\":191,\"ID\":\"112345678921212\",\"Length\":15}";
        //string strErro = "";

        object a = test(str);

        if (a is ASResponse)
        {
            return "ASResponse"; 
        }

        if (a is ASErrorResponse)
        {
            return "ASErrorResponse";
        }

        return "Nothing";
    }

[DataContract]   
public class ASResponse
{
    #region Attribut(s)
    private string idField;
    private int lengthField;
    private int callHomeField;
    private SlinkyRequest slinkyRequestField;
    private AssociationServeResponseMessage responseMessageField;
    private int errorField;
    private string slinkyIDField;
    private int tokenLengthField;
    private string tokenField;
    private SlinkyInfo slinkyInfoField;
    private string slinkyIPAddressField;
    private string videoSizeField;
    private string slinkyStreamingField;
    private int slinkyMaxFrameField;
    private int maxVideoRateField;
    private int maxAudioRateField;
    private AudioType audioTypeField;
    #endregion 

    #region Constructor(s)
    /// <summary>
    /// 
    /// </summary>
    public ASResponse()
    {
    }
    #endregion 

    #region Property(ies)
    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public string ID
    {
        get { return idField; }
        set { idField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>        
    public int Length
    {
        get 
        {
            return this.lengthField; 
        }
        set
        {
            this.lengthField = value;
        }
    }
    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public int CallHome
    {
        get { return callHomeField; }
        set 
        {
            if (this.callHomeField < StaticValues.callHomeMinValue || 
                this.callHomeField > StaticValues.callHomeMaxValue)
            {
                throw new ArgumentOutOfRangeException("CallHome value is out of Range.");
            }
            callHomeField = value; 
        }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public SlinkyRequest SlinkyRequest
    {
        get { return slinkyRequestField; }
        set { slinkyRequestField = value; }
    }


    public AssociationServeResponseMessage ResponseMessage
    {
        get { return responseMessageField; }
        set { responseMessageField = value; }
    }


    public int Error
    {
        get { return errorField; }
        set { errorField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public string SlinkyID
    {
        get { return slinkyIDField; }
        set { slinkyIDField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public int TokenLength
    {
        get { return tokenLengthField; }
        set { tokenLengthField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public string Token
    {
        get { return tokenField; }
        set { tokenField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public SlinkyInfo IsSlinkyInfoEnabled
    {
        get { return slinkyInfoField; }
        set { slinkyInfoField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public string SlinkyIPAddress
    {
        get { return slinkyIPAddressField; }
        set { slinkyIPAddressField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public string VideoSize
    {
        get { return videoSizeField; }
        set { videoSizeField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public string Streaming
    {
        get { return slinkyStreamingField; }
        set { slinkyStreamingField = value; }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public int MaxFrame
    {
        get
        {
            return slinkyMaxFrameField;
        }
        set
        {
            slinkyMaxFrameField = value;
        }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public int MaxVideoRate
    {
        get
        {
            return maxVideoRateField;
        }
        set
        {
            maxVideoRateField = value;
        }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public int MaxAudioRate
    {
        get
        {
            return maxAudioRateField;
        }
        set
        {
            maxAudioRateField = value;
        }
    }

    [DataMember]
    /// <summary>
    /// 
    /// </summary>
    public AudioType AudioType
    {
        get { return audioTypeField; }
        set { audioTypeField = value; }
    }

    /// <summary>
    /// 
    /// </summary>        

    public Dictionary<string, string> Extra_Metadata { get; set; }    
    #endregion 

}

/// <summary>
/// 
/// </summary>
[DataContract]   
public class ASErrorResponse
{
    /// <summary>
    /// 
    /// </summary>
    [DataMember]
    public int Length { get; set; }

    /// <summary>
    /// 
    /// </summary>
    [DataMember]
    public string ID { get; set; }

    /// <summary>
    /// 
    /// </summary>
    [DataMember]
    public int Errorv2 { get; set; }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    public static string FromASErrorResponseToJson(ASErrorResponse item)
    {
        string strJson = string.Empty;
        DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(ASErrorResponse));
        MemoryStream ms = new MemoryStream();
        dcjs.WriteObject(ms, item);
        strJson = Encoding.UTF8.GetString(ms.ToArray());
        return strJson;
    }
}

2 个答案:

答案 0 :(得分:0)

不是最好的解决方案,但这至少应该有效:

    public static object test(string inputString)
    {
        object obj = null;
        using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(inputString)))
        {
            try
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ASErrorResponse));
                obj = ser.ReadObject(ms) as ASErrorResponse;
            }
            catch (SerializationException)
            {

            }
        }

        using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(inputString)))
        {
            try
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ASResponse));
                obj = ser.ReadObject(ms) as ASResponse;
            }
            catch (SerializationException)
            {

            }
        }

        return obj;
    }

答案 1 :(得分:0)

这不是我的解决方案,但我使用了很多Web服务,有些还包含“AsErrorResponse”版本作为“AsResponse”的DataMembers之一。它们还向AsReponse对象添加“isSuccess”布尔值。然后,在反序列化AsResponse后,调用者可以执行以下操作:

if (AsResponse.IsSuccess)
{
  //do succcessful result processing
}
else
{
  //get error response
  AsResponse.AsErrorResponse.Errorv2
}