C# 无法强制转换类型为';X';输入';X';
我正在尝试解析Windows Phone应用程序的JSON文件,当前代码为:C# 无法强制转换类型为';X';输入';X';,c#,json,windows-phone-7,parsing,windows-phone-8,C#,Json,Windows Phone 7,Parsing,Windows Phone 8,我正在尝试解析Windows Phone应用程序的JSON文件,当前代码为: private void Button1_Tap(object sender, System.Windows.Input.GestureEventArgs e) { Button1.FontSize = 15; Button1.Content = "Fetching..."; var client = new WebClient(); clien
private void Button1_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
Button1.FontSize = 15;
Button1.Content = "Fetching...";
var client = new WebClient();
client.OpenReadCompleted +=
(s, eargs) =>
{
var serializer = new DataContractJsonSerializer(typeof(RootObject));
if (eargs.Error != null)
{
if (eargs.Error.Message.Contains("NotFound"))
{
MessageBox.Show("Could not retrieve playlist", "Error", MessageBoxButton.OK);
Button1.Content = "Could not retrieve playlist";
}
else
{
MessageBox.Show("Could not retrieve playlist", "Error", MessageBoxButton.OK);
Button1.Content = "Could not retrieve playlist";
}
}
else
{
var songHistory = (station1)serializer.ReadObject(eargs.Result);
Button1.Content = songHistory.text;
}
};
var uri = new Uri("<JSONGOESHERE>");
client.OpenReadAsync(uri);
}
public class station1
{
public string station { get; set; }
public string title { get; set; }
public string artist { get; set; }
public string text { get; set; }
}
public class station2
{
public string station { get; set; }
public int listeners { get; set; }
public string title { get; set; }
public string artist { get; set; }
public string text { get; set; }
}
public class station3
{
public string station { get; set; }
public int listeners { get; set; }
public string title { get; set; }
public string artist { get; set; }
public string text { get; set; }
}
public class RootObject
{
public station1 station1 { get; set; }
public station2 station2 { get; set; }
public station3 station3 { get; set; }
}
用户代码未处理InvalidCastException
APP.DLL中发生“System.InvalidCastException”类型的异常,但未在用户代码中处理
无法将“RootObject”类型的对象强制转换为“station1”类型
我使用了json2csharp生成器来创建上述内容,所以我不确定出了什么问题
任何帮助都会很棒。您确定该方法不必将类型作为反序列化的参数吗
var songHistory = (station1)serializer.ReadObject(eargs.Result, typeof(station1));
或者它有一个泛型重载,可以进行反序列化并直接返回一个T
var songHistory = serializer.ReadObject<station1>(eargs.Result);
var songHistory=serializer.ReadObject(eargs.Result);
您为类型RootObject
创建了一个序列化程序。因此,ReadObject
的输出就是这种类型。只需正确地强制转换它(对于ReadObject
,没有通用重载):
是
lunaradio
还是station1
?什么是LunaRootObject
vsRootObject
?您的问题不一致…在问题中出错,它是station1
和RootObject
。问题编辑。对不起,谢谢!您为RootObject
创建了一个序列化程序。为什么期望ReadObject
的输出类型为station1
?它的类型是异常状态下的RootObject
。啊,这看起来比我的更正确。使用这个,我得到了一个NullReferenceException。似乎root
和songHistory
仍然为空。“有什么想法吗?”计算机之王:这没道理。如果ReadObject
返回空值,则转换到station1将成功,并且您将在代码中看到这一点。可能回调被多次调用。进行一次空检查,看看会发生什么。终于有时间再看一看,我被告知“DataContractJsonSerializer无法将json对象中的属性“1”与RootObject
类上的属性station1
匹配。”。我的JSON文件在这里:,不确定下一步要做什么。@在计算机上,您的JSON似乎与您定义的类不对应,但我不知道它们应该是什么样子。你可能应该问另一个问题。好的,我猜这个问题已经被回答了。是时候再来一次了。谢谢
var songHistory = serializer.ReadObject<station1>(eargs.Result);
var root = (RootObject)serializer.ReadObject(eargs.Result);
var songHistory = root.station1;