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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:26:24