背景
我正在调用一个返回JSON字符串的Web服务方法。此字符串可以是ASConInfo
或ASErrorResponse
类型。
问题:
使用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;
}
}
答案 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
}