我想马上说我是一名新手开发人员,如果问题提出不正确,我深表歉意。我在任何地方都找不到如何访问嵌套的 JSON 对象。
我需要从一个非常大的 JSON 文件中提取某些字符串,将它们组合成一个对象,然后将它们收集到一个对象列表中。写一个带有必要参数的类是行不通的。这是一小段 JSON:
"result": [
{
"id": 13,
"identity": "",
"way": "reduction",
"proc": "open",
"state": "started",
"title": "Молот Тора",
"description": "",
bla-bla-bla
]
"entityType": "bidding",
"owner": {
"personId": 38,
...
"subjectRole": "OWNER",
"personContractorId": 38,
"contractorId": 38,
"contractorName": "Фьюри Ник Фф",
"contractorAvatarId": 49,
"contractorAvatarUrl": "...",
"coverFileId": 50,
"coverFileUrl": "...",
"contractorType": "PERSON",
"contractorTypeCompany": ""
}
},{
"id": 15,...
这是我遇到问题的地方。我不确定这是否从 JSON 的复制部分可见,但“结果”是根对象,其中嵌套了“所有者”对象,其中是我需要的字段的一部分。为了使用 JSON,我编写了以下类:
using Newtonsoft.Json;
using System;
namespace BackgroundTasks
{
[Serializable]
public sealed class Bid
{
[JsonProperty(PropertyName = "entityType")]
public string EntityType { get; set; }
[JsonProperty(PropertyName = "title")]
public string Title { get; set; }
[JsonProperty(PropertyName = "proc")]
public string Process { get; set; }
[JsonProperty(PropertyName = "Id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "owner")]
public object Owner { get; set; }
public Bid() { }
public Bid(string entityType, string title, string process, int id, object owner)
{
EntityType = entityType;
Title = title;
Process = process;
Id = id;
Owner = owner;
}
}
[Serializable]
public sealed class BidOwner
{
[JsonProperty(PropertyName = "contractorName")]
public string ContractorName { get; set; }
[JsonProperty(PropertyName = "contractorAvatarUrl")]
public string LogoUrl { get; set; }
public BidOwner() { }
public BidOwner(string contractorName, string logoUrl)
{
ContractorName = contractorName;
LogoUrl = logoUrl;
}
}
}
当只有 Bid 类时,“所有者”的字段未被拖动(如屏幕截图所示),其中列出了所有字段。
GET 请求,我得到字符串 jsonText 和进一步:
var json = JObject.Parse(jsonText);
List<JToken> result = json["result"].Children().ToList();
IList<Bid> bidSearchResults = new List<Bid>();
foreach (JToken res in result)
{
Bid searchResult = res.ToObject<Bid>();
bidSearchResults.Add(searchResult);
}
屏幕截图:应该是这样的,但有填充字段
截图:结果是这样的
非常感谢您提供的链接。她激励我做出自己的决定。我想立即为变量名与问题中给出的变量名之间的一些小差异道歉,但我进行了实验,事实上一切都会很清楚。
找到2个解决方案。解决方案#1:仔细检查数据后,我意识到在“foreach (JToken res in result)”循环中——“res”包含我们从嵌套对象中获取元素所需的信息(这正是我们所需要的)。为了更深入地理解:当我们将“result”的内容提取到“var resultList”列表中时,我们更深入了一层。在这个地方:
因此,我们列表中的每个元素看起来都像 jsonText,但更深一层而不是字符串。我将“res”元素转换为字符串,结果发现对于“owner”对象的 JSON 字段,我们得到的情况与最初“result”对象的 JSON 字段的情况相同。接下来是技术问题。为了这一切美好的正确运作,我还修正了“Bid”模型(现在叫“Bidding”)。一些代码:
这就是出价现在的样子:
}
结果:
有一个更容易理解的替代方案。 解决方案#2:
创建“所有者”模型
添加到出价模型:
我们的代码现在看起来像这样(为简洁起见删除了注释):
当然,这个选项更紧凑,但结果不同:( 是的,我知道你可以从 Bidding 中删除多余的部分)
在此站点上,您可以方便地从任何 Json 生成模型。然后将 json 反序列化为所需的模型并将其视为类。而且不需要写任何逻辑。