gpt4 book ai didi

c# - JSON不能反序列化为对象,需要数组?

转载 作者:行者123 更新时间:2023-11-30 13:11:21 33 4
gpt4 key购买 nike

我正在尝试获取传入的 JSON 项并将它们绑定(bind)到列表框项,但 visual studio 告诉我我需要做一个数组而不是对象?我从来没有这样做过...有人知道怎么做吗?

我的根对象:

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; }
}

注意:Genetics、Price、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 属性为它们赋予属性以协助反序列化/序列化。

[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();
}

只需将此部分替换为您的 WebClient 调用即可获取您的 JSON 数据。

现在我们可以将 JSON 反序列化为 RootObject 实例。

var rootObject = JsonConvert.DeserializeObject<RootObject>(json);

像宣传的那样工作。现在您需要将它绑定(bind)到 ListBox 控件。如果将鼠标悬停在 ListBox 实例的 ItemSource 属性上,您会看到工具提示提到您可以将它绑定(bind)到一个集合。那么单个 rootObject 不是一个集合。你不能直接绑定(bind)它。

lstBoxResults.ItemsSource = rootObject;

这行不通。您不能将 RootObject 实例转换为 System.Collections.IEnumerable。这正是 ItemsSource 所期待的。

轻松修复。让我们创建一个集合。

lstBoxResults.ItemsSource = new List<RootObject> { rootObject };

这是假设您的 JSON 数据只返回一个 rootObject。只有一项会出现在您的列表框中。

现在假设您的 JSON 数据返回一个 RootObjects 数组。例如,名为“items”的数组包含 RootItems 的集合。

{
"items": [
{
"url": "http://www.stackoverflow.com",
"display": "This is a test",
"genetics": [ "typeophere" ],
"price": [ "$1400" ],
"form": "a form"
},
{
"url": "https://github.com/geersch",
"display": "This is another test",
"genetics": [ "typeophere" ],
"price": [ "$2000" ],
"form": "another form"
}]
}

反序列化同样容易。使用 JSON.NET 获取 RootObjects 的集合。

var data = JObject.Parse(json)["items"];

现在反序列化为一个集合(IEnumerable)。

var rootObjects = JsonConvert.DeserializeObject<IEnumerable<RootObject>>(data.ToString());

因为您现在已经有了 RootObject 的集合,所以没有必要自己创建一个。您可以直接将其绑定(bind)到列表框。

lstBoxResults.ItemsSource = rootObjects;

您收到的 JSON 数据似乎无效。在解析它之前,请确保对其进行修改,以便拥有有效的 JSON 对象。

例如:

json = json.Substring(json.IndexOf("[") + 1);
json = json.Substring(0, json.LastIndexOf("]"));
var rootObjects = JsonConvert.DeserializeObject<RootObject>(json);

关于c# - JSON不能反序列化为对象,需要数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11167179/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com