C# JSON可以';无法反序列化到对象,是否需要数组?
我试图获取传入的JSON项并将它们绑定到listbox项,但VisualStudio告诉我需要执行数组而不是对象?我从来没有这样做过。。。有人知道怎么做吗 我的根对象:C# JSON可以';无法反序列化到对象,是否需要数组?,c#,json,windows-phone-7,windows-phone-7.1,windows-phone,C#,Json,Windows Phone 7,Windows Phone 7.1,Windows Phone,我试图获取传入的JSON项并将它们绑定到listbox项,但VisualStudio告诉我需要执行数组而不是对象?我从来没有这样做过。。。有人知道怎么做吗 我的根对象: public class RootObject { public string url { get; set; } public string display { get; set; } public List<string> genetics { get; set; } public
public class RootObject
{
public string url { get; set; }
public string display { get; set; }
public List<string> genetics { get; set; }
public List<string> price { get; set; }
public List<string> brandMaker { get; set; }
public string form { get; set; }
public string dosornos { get; set; }
public string qty { get; set; }
public string mfg { get; set; }
public string mobURI { get; set; }
}
JSON文件/请求基本结果:
[
{
"url": "N/A",
"display": "",
"genetics": [
"microogiz"
],
"price": [
"96.016"
],
"brandMaker": [
"Oshi Kunti Multikashi, Osaka, JP"
],
"form": "tangent",
"dosornos": "n/a",
"qty": "88G",
"mfg": "SelfMade Industries, USA Dist.",
"mobURI": "n/a"
}
]
我的原始代码:
// Get JSON via WEB
string ProviderURI = goURI;
webClient webClient = new WebClient();
webClient.DownloadStringCompleted += new
DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
webClient.DownloadStringAsync(new Uri(ProviderURI));
void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
{
return;
}
var deserializedJSON = JsonConvert.DeserializeObject<RootObject>(e.Result);
lstBoxResults.ItemsSource = deserializedJSON; // or deserializedJSON.url.ToString();
}
//通过WEB获取JSON
字符串ProviderURI=goURI;
webClient webClient=新的webClient();
webClient.DownloadStringCompleted+=新建
DownloadStringCompletedEventHandler(webClient\u DownloadStringCompleted);
下载StringAsync(新Uri(ProviderURI));
void webClient_DownloadStringCompleted已完成(对象发送方,DownloadStringCompletedEventArgs e)
{
如果(例如错误!=null)
{
返回;
}
var deserializedJSON=JsonConvert.DeserializeObject(e.Result);
lstBoxResults.ItemsSource=deserializedJSON;//或deserializedJSON.url.ToString();
}
好的,您提到genetics和price是数组,但返回的JSON只包含一项。RootObject的其余部分是简单的字符串属性
因为您没有发布原始JSON示例。让我提出一个精简版本,使事情简单和简短
{
"url": "http://www.stackoverflow.com",
"display": "This is a test",
"genetics": [
"typeophere"
],
"price": [
"$1400"
],
"form": "a form"
}
现在我们可以减少RootObject类的类型。我对属性使用Pascal大小写,并用JSON.NET属性对它们进行属性化,以帮助进行反序列化/序列化
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class RootObject
{
[JsonProperty(PropertyName = "url")]
public string Url { get; set; }
[JsonProperty(PropertyName = "display")]
public string Display { get; set; }
[JsonProperty(PropertyName = "genetics")]
public List<string> Genetics { get; set; }
[JsonProperty(PropertyName = "price")]
public List<string> Price { get; set; }
[JsonProperty(PropertyName = "form")]
public string Form { get; set; }
}
只需将此部分替换为WebClient调用以获取JSON数据
现在我们可以将JSON反序列化为一个RootObject实例
var rootObject = JsonConvert.DeserializeObject<RootObject>(json);
这是行不通的。无法将RootObject实例转换为System.Collections.IEnumerable。这正是ItemsSource所期待的
容易解决。让我们创建一个集合
lstBoxResults.ItemsSource = new List<RootObject> { rootObject };
反序列化同样容易。使用JSON.NET获取RootObjects的集合
var data = JObject.Parse(json)["items"];
现在反序列化为一个集合(IEnumerable)
您收到的JSON数据似乎无效。在解析它之前,请确保对它进行了修改,以获得有效的JSON对象
例如:
json = json.Substring(json.IndexOf("[") + 1);
json = json.Substring(0, json.LastIndexOf("]"));
var rootObjects = JsonConvert.DeserializeObject<RootObject>(json);
json=json.Substring(json.IndexOf(“[”)+1);
json=json.Substring(0,json.LastIndexOf(“]);
var rootObjects=JsonConvert.DeserializeObject(json);
试试这个
RootObject rootObject;
if (json.startsWith("["))
{
rootObject = JsonConvert.DeserializeObject<List<RootObject>>(json)[0];
}
else
{
rootObject = JsonConvert.DeserializeObject<RootObject>(json);
}
RootObject-RootObject;
if(json.startsWith(“[”))
{
rootObject=JsonConvert.DeserializeObject(json)[0];
}
其他的
{
rootObject=JsonConvert.DeserializeObject(json);
}
你能发布古里返回的原始JSON吗?请发布一个原始JSON响应。这只是一个提示,但要开始使用适当的大小写,例如属性的Pascal大小写。局部变量的Camel大小写…等等。我想你得到了字符串的回报…首先将该字符串解析为JSON,然后反序列化它。dbaseman&Christophe Geers I just添加了它。首先,非常感谢您的帮助!不过我确实有一个问题…在我请求JSON文件并告诉它转到下载StringCompleted后,我运行:“var rootObject=JsonConvert.DeserializeObject(e.Result);pillResults.ItemsSource=new List{rootObject}”;甚至使用您的类也会出现以下错误:无法将当前JSON数组(例如[1,2,3])反序列化为“HealthCenter.MainPage+RootObject”类型,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化。请将JSON更改为JSON对象(例如{“name”:“value”})更改为arrayWell,您在问题中显示的JSON响应无效。如果我尝试解析该响应,则会出现相同的异常。请删除括号[]你可以解析一个有效的JSON对象。不过它只是一个RootObject。嗨,Christophe,不幸的是,我认为公司还不会让我更改它们,但我会提交一个副本。它可以在我们的iOS设备上工作,但奇数WP7无法完成。再次感谢你的帮助!你将JSON数据作为一个字符串接收。请继续在使用JSON.NET库解析之前更正它。并不是说你应该去修复提供它的web服务。很遗憾,如果/选中将rootObject添加到Listboxs itemssource,那么第一步就不能成功,但这没关系。唯一的另一个问题是,如果我正在使用say、brandMaker和do rootObject.brandMaker进行操作,我必须添加。到String();但不显示,它显示System.Collections…无论哪种方式,都适用于某些项目,太棒了,谢谢!
{
"items": [
{
"url": "http://www.stackoverflow.com",
"display": "This is a test",
"genetics": [ "typeophere" ],
"price": [ "$1400" ],
"form": "a form"
},
{
"url": "http://cgeers.com",
"display": "This is another test",
"genetics": [ "typeophere" ],
"price": [ "$2000" ],
"form": "another form"
}]
}
var data = JObject.Parse(json)["items"];
var rootObjects = JsonConvert.DeserializeObject<IEnumerable<RootObject>>(data.ToString());
lstBoxResults.ItemsSource = rootObjects;
json = json.Substring(json.IndexOf("[") + 1);
json = json.Substring(0, json.LastIndexOf("]"));
var rootObjects = JsonConvert.DeserializeObject<RootObject>(json);
RootObject rootObject;
if (json.startsWith("["))
{
rootObject = JsonConvert.DeserializeObject<List<RootObject>>(json)[0];
}
else
{
rootObject = JsonConvert.DeserializeObject<RootObject>(json);
}