You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析牛津词典API的JSON响应?解析后对象数据为空求解决

解析牛津词典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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:12:19