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

Swift/Obj-C中如何用泛型类与函数实现对象转JSON

嘿,我来帮你搞定这个泛型转JSON的需求!咱们分Swift和Objective-C两种情况来拆解,核心思路是用协议约束可转换的类型,让泛型知道该如何处理传入的对象,一步步来~

Swift 实现方案

1. 定义JSON转换协议

首先得给可转换的类型定个规矩:所有要转JSON的类都得实现一个转字典的方法。我们定义一个JSONConvertible协议:

protocol JSONConvertible {
    func toJSON() -> [String: Any?]
}

2. 让Type1、Type2遵守协议

给你的两个类扩展实现协议方法,各自负责把自己的成员变量转成对应键值对:

class Type1 { 
    var member1: String? 
    var member2: String? 
    init(member1: String,member2: String) { 
        self.member1 = member1 
        self.member2 = member2 
    } 
}

extension Type1: JSONConvertible {
    func toJSON() -> [String: Any?] {
        return [
            "member1": member1,
            "member2": member2
        ]
    }
}

class Type2 { 
    var member3: String? 
    var member4: String? 
    init(member3: String,member4: String) { 
        self.member3 = member3 
        self.member4 = member4 
    } 
}

extension Type2: JSONConvertible {
    func toJSON() -> [String: Any?] {
        return [
            "member3": member3,
            "member4": member4
        ]
    }
}

3. 泛型函数/类实现转换

现在就可以写泛型代码了,只要是遵守JSONConvertible的类型,都能被处理:

泛型函数

func convertToJSON<T: JSONConvertible>(_ object: T) -> [String: Any?] {
    return object.toJSON()
}

泛型工具类(如果需要类形式的话)

class JSONConverter<T: JSONConvertible> {
    func convert(_ object: T) -> [String: Any?] {
        return object.toJSON()
    }
}

测试验证

let type1Obj = Type1(member1: "someValue1", member2: "someValue2")
print(convertToJSON(type1Obj)) // 输出 ["member1": "someValue1", "member2": "someValue2"]

let type2Obj = Type2(member3: "someValue3", member4: "someValue4")
let converter = JSONConverter<Type2>()
print(converter.convert(type2Obj)) // 输出 ["member3": "someValue3", "member4": "someValue4"]

如果需要转成JSON字符串,还可以给协议加个扩展:

extension JSONConvertible {
    func toJSONString() -> String? {
        guard let data = try? JSONSerialization.data(withJSONObject: toJSON(), options: .prettyPrinted) else {
            return nil
        }
        return String(data: data, encoding: .utf8)
    }
}

// 调用示例
print(type1Obj.toJSONString() ?? "")

Objective-C 实现方案

OC的泛型主要是编译期检查,我们同样用协议来约束可转换类型,步骤类似:

1. 定义JSON转换协议

@protocol JSONConvertible <NSObject>
- (NSDictionary *)toJSON;
@end

2. 修改Type1、Type2并遵守协议

注意OC里类要继承NSObject,然后实现协议方法:

@interface Type1 : NSObject <JSONConvertible>
@property (nonatomic, copy) NSString *member1;
@property (nonatomic, copy) NSString *member2;
- (instancetype)initWithMember1:(NSString *)member1 member2:(NSString *)member2;
@end

@implementation Type1
- (instancetype)initWithMember1:(NSString *)member1 member2:(NSString *)member2 {
    self = [super init];
    if (self) {
        _member1 = member1;
        _member2 = member2;
    }
    return self;
}

#pragma mark - JSONConvertible
- (NSDictionary *)toJSON {
    // 用[NSNull null]处理nil值,避免JSON序列化失败
    return @{@"member1": _member1 ?: [NSNull null],
             @"member2": _member2 ?: [NSNull null]};
}
@end

@interface Type2 : NSObject <JSONConvertible>
@property (nonatomic, copy) NSString *member3;
@property (nonatomic, copy) NSString *member4;
- (instancetype)initWithMember3:(NSString *)member3 member4:(NSString *)member4;
@end

@implementation Type2
- (instancetype)initWithMember3:(NSString *)member3 member4:(NSString *)member4 {
    self = [super init];
    if (self) {
        _member3 = member3;
        _member4 = member4;
    }
    return self;
}

#pragma mark - JSONConvertible
- (NSDictionary *)toJSON {
    return @{@"member3": _member3 ?: [NSNull null],
             @"member4": _member4 ?: [NSNull null]};
}
@end

3. 泛型函数/类实现

OC的泛型函数和类写法如下,泛型约束为JSONConvertible:

泛型函数

NSDictionary *convertToJSON(id<JSONConvertible> object) {
    return [object toJSON];
}

泛型工具类

@interface JSONConverter<T: id<JSONConvertible>> : NSObject
- (NSDictionary *)convert:(T)object;
@end

@implementation JSONConverter
- (NSDictionary *)convert:(id<JSONConvertible>)object {
    return [object toJSON];
}
@end

测试验证

Type1 *type1Obj = [[Type1 alloc] initWithMember1:@"someValue1" member2:@"someValue2"];
NSLog(@"%@", convertToJSON(type1Obj)); // 输出 {"member1":"someValue1","member2":"someValue2"}

Type2 *type2Obj = [[Type2 alloc] initWithMember3:@"someValue3" member4:@"someValue4"];
JSONConverter<Type2> *converter = [[JSONConverter alloc] init];
NSLog(@"%@", [converter convert:type2Obj]); // 输出 {"member3":"someValue3","member4":"someValue4"}

如果要转成JSON字符串,可以加个工具方法:

NSString *JSONStringFromDictionary(NSDictionary *dict) {
    NSError *error;
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
    if (error) {
        NSLog(@"JSON转换失败:%@", error);
        return nil;
    }
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

// 调用示例
NSLog(@"%@", JSONStringFromDictionary(convertToJSON(type1Obj)));

内容的提问来源于stack exchange,提问作者adak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:13:15