Swift 4 Xcode中使用JSON Decode解析WooCommerce API数据的异常问题
解决WooCommerce API中
featured_src类型不一致导致的应用崩溃问题 这个问题我之前对接WooCommerce API的时候也踩过坑!明明字段叫src,结果无图时居然返回布尔值false,而不是空字符串或者null,强类型语言里直接声明成String类型肯定会炸。下面分享几个我亲测有效的解决办法:
1. 在数据解析层做类型兼容处理
这是最直接的方案,在JSON解析环节就把类型统一成字符串,避免后续代码出现类型转换异常。举几个不同语言的实现例子:
Java/Kotlin(用Gson)
写一个自定义TypeAdapter专门处理featured_src的类型转换:
public class FeaturedSrcAdapter extends TypeAdapter<String> { @Override public void write(JsonWriter out, String value) throws IOException { out.value(value); } @Override public String read(JsonReader in) throws IOException { JsonToken token = in.peek(); // 遇到布尔值直接返回空字符串,字符串类型正常读取 if (token == JsonToken.BOOLEAN) { in.nextBoolean(); // 跳过布尔值 return ""; } else if (token == JsonToken.STRING) { return in.nextString(); } // 处理其他意外类型,返回默认空字符串 in.skipValue(); return ""; } }
把适配器注册到Gson实例中:
Gson gson = new GsonBuilder() .registerTypeAdapter(String.class, new FeaturedSrcAdapter()) .create(); // 用这个gson解析API返回的JSON数据
TypeScript
用类型守卫把原始数据转换成统一的类型:
// API返回的原始数据类型 interface RawProduct { id: number; name: string; featured_src: string | boolean; // 其他字段... } // 处理后的安全类型,确保featured_src是字符串 interface ProcessedProduct { id: number; name: string; featured_src: string; // 其他字段... } // 转换函数 function normalizeProduct(raw: RawProduct): ProcessedProduct { return { ...raw, featured_src: typeof raw.featured_src === 'boolean' ? '' : raw.featured_src }; }
2. 绕过featured_src,直接从images字段提取图片URL
WooCommerce API返回的商品数据里还有images字段,这是一个数组(无图时为空数组),从这里取图片URL更可靠,完全规避类型问题:
比如请求商品时指定返回images字段(如果不需要全量字段的话):
# 示例GET请求 /wp-json/wc/v3/products?_fields=id,name,images
然后在代码里处理:
// Kotlin示例,假设Product类有images: List<Image>字段 val featuredSrc = product.images.firstOrNull()?.src ?: ""
这样不管有没有图片,featuredSrc都是字符串类型,不会出现崩溃。
3. 在模型类里做兼容封装
如果不想修改解析逻辑,可以在模型类里封装一个安全的属性来替代原始的featured_src:
data class Product( val id: Long, val name: String, private val featured_src: Any? // 用Any?接收原始类型 ) { // 对外暴露安全的字符串类型属性 val safeFeaturedSrc: String get() = when (featured_src) { is String -> featured_src else -> "" // 非字符串类型统一返回空字符串 } }
之后在业务代码里只使用product.safeFeaturedSrc即可。
内容的提问来源于stack exchange,提问作者Arsalan Zahedi Rad
相关产品推荐
相关产品推荐

