我试图把传入的JSON项目并将其绑定到列表框中的项目,但我由Visual Studio,我需要做一个数组和对象不告诉? 我从来没有做到这一点...任何人都知道怎么样?
我RootObject:
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; }
}
注:遗传学,价格,BrandMaker实际上并不返回任何东西,但一个值,如下图所示:
"genetics": [
"typeophere"
],
"price": [
"$1400"
],
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();
}
好吧,你提到遗传学和价格是数组,但返回JSON只包含一个项目。 您RootObject其余的都是简单的字符串属性。
既然你没有张贴生JSON的例子。 让我呈现下调的版本,让事情变得简单而短。
{
"url": "http://www.stackoverflow.com",
"display": "This is a test",
"genetics": [
"typeophere"
],
"price": [
"$1400"
],
"form": "a form"
}
现在,我们可以修剪下来RootObject类类型。 我用Pascal大小写为我的特性,由于它们与JSON.NET属性,以协助deserialing /串行化。
[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; }
}
因为我不知道网络服务,你在呼唤我只是存储在此JSON在一个文本文件中。 将其标记为嵌入的资源,并从那里阅读。
string json;
var resource = Application.GetResourceStream(new Uri("json.txt", UriKind.Relative));
using (var reader = new StreamReader(resource.Stream))
{
json = reader.ReadToEnd();
}
只需更换这部分与你的Web客户端调用以获取你的JSON数据。
现在,我们可以反序列化JSON的成RootObject实例。
var rootObject = JsonConvert.DeserializeObject<RootObject>(json);
像宣传的那样。 现在,您需要将其绑定到一个ListBox控件。 如果你将鼠标悬停在您的列表框实例的属性的ItemSource你会看到工具提示中提到,您可以将其绑定到一个集合。 好一个rootObject不是一个集合。 你不能直接绑定。
lstBoxResults.ItemsSource = rootObject;
这是不行的。 你可以不RootObject实例转换为System.Collections.IEnumerable。 这是什么的ItemsSource期待。
简单的办法。 让我们创建一个集合。
lstBoxResults.ItemsSource = new List<RootObject> { rootObject };
这是假设你的JSON数据只返回一个rootObject。 只有一个项目将出现在你的列表框。
现在让我们假设你的JSON数据返回RootObjects的数组。 例如数组称为其中包含RootItems的集合“项目”。
{
"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"
}]
}
Deserialing这同样容易。 使用JSON.NET获得RootObjects的集合。
var data = JObject.Parse(json)["items"];
现在反序列化到一个集合(IEnumerable的)。
var rootObjects = JsonConvert.DeserializeObject<IEnumerable<RootObject>>(data.ToString());
既然你现在已经有RootObject的集合,没有必要自己创建一个。 你可以把它直接绑定到ListBox。
lstBoxResults.ItemsSource = rootObjects;
好像你收到无效的JSON数据。 就在分析它确保您修改它,让你有一个有效的JSON对象。
例如:
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);
}