如何解析牛津词典API的JSON响应?解析后对象数据为空求解决
嘿,我看你在解析牛津词典API的JSON时遇到了对象为空的问题,大概率是你的JSONWord类的属性定义和API返回的实际JSON结构不匹配导致的——毕竟牛津词典的API返回结构层级多,字段类型也不是简单的单值字符串,咱们一步步来解决:
核心问题:属性类型与API返回结构不匹配
你当前把etymologies、examples、definitions都定义成了string类型,但牛津API返回的这些字段大多是数组或者嵌套对象数组,序列化工具(比如Newtonsoft.Json)无法将数组映射到单个字符串,所以这些属性会是空值。
第一步:先明确牛津API的典型返回结构
先给你看一段简化后的API返回片段,帮你理解层级:
{
"id": "apple",
"results": [
{
"lexicalEntries": [
{
"entries": [
{
"etymologies": ["Middle English appel, from Old English æppel..."],
"senses": [
{
"definitions": ["The round fruit of a tree of the rose family..."],
"examples": [{"text": "She ate an apple a day"}]
}
]
}
]
}
]
}
]
}
你会发现,definitions、etymologies是字符串数组,examples是包含text属性的对象数组,而且这些字段都嵌套在results -> lexicalEntries -> entries -> senses的层级里,不是根节点的直接字段。
第二步:定义匹配的C#类结构
根据上面的结构,你需要定义完整的嵌套类来对应API返回:
// 根节点响应类 public class OxfordDictionaryResponse { [JsonProperty("id")] public string WordId { get; set; } [JsonProperty("results")] public List<Result> Results { get; set; } } public class Result { [JsonProperty("lexicalEntries")] public List<LexicalEntry> LexicalEntries { get; set; } } public class LexicalEntry { [JsonProperty("entries")] public List<Entry> Entries { get; set; } } public class Entry { [JsonProperty("etymologies")] public List<string> Etymologies { get; set; } [JsonProperty("senses")] public List<Sense> Senses { get; set; } } public class Sense { [JsonProperty("definitions")] public List<string> Definitions { get; set; } [JsonProperty("examples")] public List<Example> Examples { get; set; } } public class Example { [JsonProperty("text")] public string UsageText { get; set; } }
第三步:正确反序列化并提取数据
现在你可以用这个结构来反序列化API响应,然后逐层提取你需要的内容:
// 假设你已经通过HttpClient获取到了API返回的JSON字符串 var responseJson = await yourHttpClient.GetStringAsync(oxfordApiUrl); var oxfordResponse = JsonConvert.DeserializeObject<OxfordDictionaryResponse>(responseJson); // 提取第一个释义、词源和例句(注意空值判断,避免空引用异常) var firstEtymology = oxfordResponse.Results?[0]?.LexicalEntries?[0]?.Entries?[0]?.Etymologies?[0]; var firstDefinition = oxfordResponse.Results?[0]?.LexicalEntries?[0]?.Entries?[0]?.Senses?[0]?.Definitions?[0]; var firstExample = oxfordResponse.Results?[0]?.LexicalEntries?[0]?.Entries?[0]?.Senses?[0]?.Examples?[0]?.UsageText;
额外排查小技巧
- 先把API返回的完整JSON字符串打印出来,和你的类结构逐字段对比,确认类型、层级、键名是否完全匹配(JSON键名是大小写敏感的,除非你配置了
JsonSerializerSettings忽略大小写) - 可以先用
dynamic类型临时反序列化,快速查看实际结构:var dynamicResponse = JsonConvert.DeserializeObject<dynamic>(responseJson);,再根据动态对象的结构调整类定义 - 检查是否有拼写错误,比如
JsonProperty里的键名是否和JSON里的完全一致(比如你写的"examples",API里是不是也是这个键?)
内容的提问来源于stack exchange,提问作者iamal

