处理WordPress REST API中空ACF字段返回false的问题
WordPress REST API 带ACF字段反序列化空值为False的类型转换问题
问题场景
我用WordPress REST API拉取带有ACF自定义字段的自定义文章类型数据,再反序列化为C#应用里的自定义类。当所有ACF字段都填充时一切正常,但空字段API会返回false而非null或直接排除,导致反序列化TaxonomyTerm类时抛出类型转换错误:
Error converting value False to type 'MvcApplication.Models.ResourceLibrary.searchResult+TaxonomyTerm'
我的TaxonomyTerm类结构如下:
public class TaxonomyTerm { public int term_id { get; set; } public string name { get; set; } public string slug { get; set; } public int term_group { get; set; } public int term_taxonomy_id { get; set; } public string taxonomy { get; set; } public string description { get; set; } public int parent { get; set; } public int count { get; set; } public string filter { get; set; } }
示例JSON
- 字段填充完整的ACF部分:
"acf":{ "author":"PR", "year":"2022", "keywords":"test keywords", "category":{ "term_id":21, "name":"Audit Program", "slug":"audit-program", "term_group":0, "term_taxonomy_id":21, "taxonomy":"vl_cat", "description":"", "parent":0, "count":0, "filter":"raw" } }
- 空字段的ACF部分:
"acf":{ "author":"", "year":"", "keywords":"", "category":false, "bok_cats":false, "file":false, "external_url":"", "kentico_node_id":"" }
补充说明
仅在请求端点附加?acf_format=standard时出现该问题,不加此参数时空字段会返回预期的null,但我需要这个参数来获取分类术语、文件等的完整对象数据,而非仅ID。
解决方案
方案1:C#端自定义JSON转换器(推荐)
针对TaxonomyTerm类型编写自定义转换器,反序列化时遇到false就返回null。以Newtonsoft.Json为例:
public class TaxonomyTermConverter : JsonConverter<TaxonomyTerm> { public override TaxonomyTerm ReadJson(JsonReader reader, Type objectType, TaxonomyTerm existingValue, bool hasExistingValue, JsonSerializer serializer) { // 如果读取到布尔值false,返回null if (reader.TokenType == JsonToken.Boolean && (bool)reader.Value == false) { return null; } // 否则正常反序列化 return serializer.Deserialize<TaxonomyTerm>(reader); } public override void WriteJson(JsonWriter writer, TaxonomyTerm value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
使用方式:
- 在
TaxonomyTerm类上添加特性:[JsonConverter(typeof(TaxonomyTermConverter))] public class TaxonomyTerm { ... } - 或者在反序列化时传入转换器:
var settings = new JsonSerializerSettings(); settings.Converters.Add(new TaxonomyTermConverter()); var result = JsonConvert.DeserializeObject<YourRootClass>(jsonString, settings);
方案2:WordPress端修改ACF输出
通过ACF的钩子,把空字段返回的false替换为null,在WordPress主题的functions.php中添加以下代码:
add_filter('acf/format_value', 'acf_replace_false_with_null', 10, 3); function acf_replace_false_with_null($value, $post_id, $field) { // 仅当值为false时替换为null if ($value === false) { return null; } return $value; }
这样API返回的空字段会变成null,C#端反序列化时就能正常识别为null,不会触发类型转换错误。
方案3:粗暴替换JSON字符串(不推荐)
如果字段数量少且没有其他布尔字段,可以先把JSON字符串中的"字段名":false替换为"字段名":null,再反序列化:
jsonString = jsonString.Replace("\"category\":false", "\"category\":null") .Replace("\"bok_cats\":false", "\"bok_cats\":null") .Replace("\"file\":false", "\"file\":null"); var result = JsonConvert.DeserializeObject<YourRootClass>(jsonString);
但这种方法灵活性差,新增字段时需要手动更新替换规则,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者user3562286
相关产品推荐
相关产品推荐

