MJExtension
A fast, convenient and nonintrusive conversion framework between JSON and model. Your model class doesn't need to extend any base class. You don't need to modify any model file.
Top Related Projects
A delightful networking framework for iOS, macOS, watchOS, and tvOS.
Model framework for Cocoa and Cocoa Touch
Magical Data Modeling Framework for JSON - allows rapid creation of smart data models. You can use it in your iOS, macOS, watchOS and tvOS apps.
The better way to deal with JSON data in Swift.
Elegant HTTP Networking in Swift
Quick Overview
MJExtension is a powerful and easy-to-use JSON and model conversion framework for Objective-C. It simplifies the process of converting JSON to model objects and vice versa, making it easier to work with APIs and data persistence in iOS and macOS applications.
Pros
- Fast and efficient conversion between JSON and model objects
- Supports complex nested structures and custom property mappings
- Automatic type conversion for common data types
- Extensive documentation and active community support
Cons
- Limited to Objective-C, not suitable for Swift-only projects
- May require additional configuration for complex scenarios
- Performance may degrade with extremely large datasets
- Dependency on runtime features may lead to potential issues in future iOS versions
Code Examples
- Converting JSON to a model object:
NSDictionary *jsonDict = @{
@"name": @"John Doe",
@"age": @30,
@"email": @"john@example.com"
};
User *user = [User mj_objectWithKeyValues:jsonDict];
- Converting a model object to JSON:
User *user = [[User alloc] init];
user.name = @"Jane Smith";
user.age = 25;
user.email = @"jane@example.com";
NSDictionary *jsonDict = [user mj_keyValues];
- Handling nested objects:
NSDictionary *jsonDict = @{
@"name": @"John Doe",
@"address": @{
@"street": @"123 Main St",
@"city": @"New York"
}
};
User *user = [User mj_objectWithKeyValues:jsonDict];
- Custom property mapping:
+ (NSDictionary *)mj_replacedKeyFromPropertyName {
return @{
@"identifier": @"id",
@"userName": @"user_name"
};
}
Getting Started
- Install MJExtension using CocoaPods by adding the following to your Podfile:
pod 'MJExtension'
- Import MJExtension in your Objective-C file:
#import <MJExtension/MJExtension.h>
- Create a model class and implement the necessary properties:
@interface User : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSString *email;
@end
- Use MJExtension methods to convert between JSON and model objects:
NSDictionary *jsonDict = @{@"name": @"John", @"age": @30, @"email": @"john@example.com"};
User *user = [User mj_objectWithKeyValues:jsonDict];
Competitor Comparisons
A delightful networking framework for iOS, macOS, watchOS, and tvOS.
Pros of AFNetworking
- Comprehensive networking library with support for various HTTP methods and protocols
- Robust error handling and request/response serialization
- Extensive documentation and community support
Cons of AFNetworking
- Larger codebase and potential overhead for simpler networking tasks
- Steeper learning curve for beginners compared to MJExtension
- More frequent updates may require occasional code adjustments
Code Comparison
AFNetworking:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"https://api.example.com/data" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"Error: %@", error);
}];
MJExtension:
NSDictionary *dict = @{@"name": @"Jack", @"age": @20};
Person *person = [Person mj_objectWithKeyValues:dict];
NSLog(@"Name: %@, Age: %d", person.name, person.age);
Note that these libraries serve different purposes: AFNetworking is for networking tasks, while MJExtension is for JSON/model conversion. The code examples demonstrate their primary use cases.
Model framework for Cocoa and Cocoa Touch
Pros of Mantle
- More robust error handling and validation
- Better support for complex object graphs and nested relationships
- Stronger type safety and compile-time checks
Cons of Mantle
- Steeper learning curve and more complex setup
- Slower performance for simple JSON parsing tasks
- Less frequently updated and maintained
Code Comparison
MJExtension:
@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
@end
NSDictionary *dict = @{@"name": @"John", @"age": @25};
User *user = [User mj_objectWithKeyValues:dict];
Mantle:
@interface User : MTLModel <MTLJSONSerializing>
@property (copy, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
@end
NSDictionary *dict = @{@"name": @"John", @"age": @25};
NSError *error;
User *user = [MTLJSONAdapter modelOfClass:[User class] fromJSONDictionary:dict error:&error];
MJExtension offers a simpler API for basic JSON parsing, while Mantle provides more control and error handling at the cost of additional setup. MJExtension is generally faster for simple tasks, but Mantle excels in handling complex data structures and ensuring type safety.
Magical Data Modeling Framework for JSON - allows rapid creation of smart data models. You can use it in your iOS, macOS, watchOS and tvOS apps.
Pros of JSONModel
- Provides a more robust validation system for JSON data
- Offers better support for custom data types and transformations
- Includes built-in networking capabilities for fetching JSON data
Cons of JSONModel
- Generally slower performance compared to MJExtension
- More complex setup and usage, requiring more boilerplate code
- Less frequently updated and maintained compared to MJExtension
Code Comparison
MJExtension:
@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
@end
NSDictionary *dict = @{@"name": @"John", @"age": @25};
User *user = [User mj_objectWithKeyValues:dict];
JSONModel:
@interface User : JSONModel
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
@end
NSError *error;
User *user = [[User alloc] initWithDictionary:dict error:&error];
Both MJExtension and JSONModel are popular libraries for JSON parsing in Objective-C. MJExtension is known for its simplicity and high performance, making it ideal for projects with straightforward JSON structures. On the other hand, JSONModel offers more advanced features and stricter data validation, which can be beneficial for complex data models or when working with unreliable JSON sources. The choice between the two depends on the specific requirements of your project and the complexity of the JSON data you're working with.
The better way to deal with JSON data in Swift.
Pros of SwiftyJSON
- Designed specifically for Swift, offering a more idiomatic and type-safe approach to JSON handling
- Provides a simple, chainable syntax for accessing nested JSON structures
- Supports subscripting and optional binding, making it easier to handle optional values
Cons of SwiftyJSON
- Limited to JSON parsing and manipulation, whereas MJExtension offers broader object mapping capabilities
- May require more manual work for complex object mappings compared to MJExtension's automatic mapping features
- Less suitable for projects that need to work with both Objective-C and Swift
Code Comparison
SwiftyJSON:
let json = JSON(data: dataFromNetworking)
if let name = json["user"]["name"].string {
print(name)
}
MJExtension:
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:dataFromNetworking options:kNilOptions error:nil];
User *user = [User mj_objectWithKeyValues:dict];
NSLog(@"%@", user.name);
SwiftyJSON offers a more concise and Swift-friendly syntax for JSON parsing, while MJExtension provides a straightforward approach to object mapping in Objective-C. SwiftyJSON is better suited for Swift-only projects focusing on JSON handling, whereas MJExtension offers broader functionality for object mapping in both Objective-C and Swift environments.
Elegant HTTP Networking in Swift
Pros of Alamofire
- More comprehensive networking library with features like request/response handling, authentication, and parameter encoding
- Active development and maintenance with frequent updates and a large community
- Extensive documentation and examples for easier implementation
Cons of Alamofire
- Larger codebase and potentially higher learning curve for beginners
- May be overkill for simple networking tasks or projects with minimal API interactions
Code Comparison
MJExtension (JSON parsing):
let dict = ["name": "John", "age": 30]
let person = Person.mj_object(withKeyValues: dict)
Alamofire (Network request):
AF.request("https://api.example.com/data").responseJSON { response in
switch response.result {
case .success(let value):
print("JSON: \(value)")
case .failure(let error):
print("Error: \(error)")
}
}
While MJExtension focuses on JSON parsing and object mapping, Alamofire is a full-featured networking library. MJExtension is more lightweight and specific to data transformation, while Alamofire provides a complete solution for network operations, including requests, responses, and data handling. The choice between the two depends on the project's specific networking and data processing requirements.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
MJExtension
- A fast, convenient and nonintrusive conversion framework between JSON and model.
- 转æ¢é度快ã使ç¨ç®åæ¹ä¾¿çåå ¸è½¬æ¨¡åæ¡æ¶
ðâð»Release Notes: more details
Contents
- Getting Started ãå¼å§ä½¿ç¨ã
- Examples ã示ä¾ã
- Usage in Swift
- JSON -> Model
- JSONString -> Model
- Model contains model
- Model contains model-array
- Model name - JSON key mapping
- JSON array -> model array
- Model -> JSON
- Model array -> JSON array
- Core Data
- Coding
- Secure Coding
- Camel -> underline
- NSString -> NSDate, nil -> @""
- NSDate -> NSString
- More use cases
Getting Startedãå¼å§ä½¿ç¨ã
Featuresãè½åä»ä¹ã
- MJExtensionæ¯ä¸å¥åå ¸å模åä¹é´äºç¸è½¬æ¢çè¶ è½»é级æ¡æ¶
JSON
-->Model
ãCore Data Model
JSONString
-->Model
ãCore Data Model
Model
ãCore Data Model
-->JSON
JSON Array
-->Model Array
ãCore Data Model Array
JSONString
-->Model Array
ãCore Data Model Array
Model Array
ãCore Data Model Array
-->JSON Array
- Coding all properties of a model with only one line of code.
- åªéè¦ä¸è¡ä»£ç ï¼å°±è½å®ç°æ¨¡åçææå±æ§è¿è¡Coding / SecureCodingï¼å½æ¡£å解档ï¼
Installationãå®è£ ã
CocoaPodsã使ç¨CocoaPodsã
pod 'MJExtension'
Carthage
github "CoderMJLee/MJExtension"
Swift Package Manager
Released from 3.4.0
Manuallyãæå¨å¯¼å ¥ã
- Drag all source files under folder
MJExtension
to your project.ãå°MJExtension
æ件夹ä¸çæææºä»£ç æ½å ¥é¡¹ç®ä¸ã - Import the main header fileï¼
#import "MJExtension.h"
ãå¯¼å ¥ä¸»å¤´æ件ï¼#import "MJExtension.h"
ã
Examplesã示ä¾ã
Add MJKeyValue
protocol to your model if neededãå¦ææéè¦, 请å¨æ¨¡åä¸å å
¥ MJKeyValue
åè®®ã
Usage in Swift [å ³äºå¨Swiftä¸ä½¿ç¨MJExtension] â¼ï¸
Example:
@objc(MJTester)
@objcMembers
class MJTester: NSObject {
// make sure to use `dynamic` attribute for basic type & must use as Non-Optional & must set initial value
dynamic var isSpecialAgent: Bool = false
dynamic var age: Int = 0
var name: String?
var identifier: String?
}
@objc
or@objcMembers
attributes should be added to class or property for declaration of Objc accessibility [å¨ Swift4 ä¹å, 请å¨å±æ§åå@objc
修饰æå¨ç±»åå¢å@objcMembers
. 以ä¿è¯ Swift çå±æ§è½å¤æ´é²ç» Objc 使ç¨. ]- If you let
Bool
&Int
as property type, make sure that usingdynamic
to attribute it. It must beNon-Optional
type and assigna default value
.[å¦æè¦ä½¿ç¨Bool
åInt
ç Swfit ä¸ç¨åºæ¬ç±»å, 请使ç¨dynamic
å ³é®å修饰, ç±»å为Non-Optional
, 並ä¸ç»å®åå§å¼.]
纯SwiftççJSONä¸Model转æ¢æ¡æ¶å·²ç»å¼æºä¸æ¶
- KakaJSON
- ä¸ææç¨
- å¦æä½ ç项ç®æ¯ç¨SwiftåçModelï¼å¢è£æ¨è使ç¨KakaJSON
- å·²ç»å¯¹åç§å¸¸ç¨çæ°æ®åºæ¯è¿è¡äºå¤§éçåå æµè¯
- ç®åæç¨ãåè½ä¸°å¯ã转æ¢å¿«é
The most simple JSON -> Modelãæç®åçåå ¸è½¬æ¨¡åã
typedef enum {
SexMale,
SexFemale
} Sex;
@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *icon;
@property (assign, nonatomic) unsigned int age;
@property (copy, nonatomic) NSString *height;
@property (strong, nonatomic) NSNumber *money;
@property (assign, nonatomic) Sex sex;
@property (assign, nonatomic, getter=isGay) BOOL gay;
@end
/***********************************************/
NSDictionary *dict = @{
@"name" : @"Jack",
@"icon" : @"lufy.png",
@"age" : @20,
@"height" : @"1.55",
@"money" : @100.9,
@"sex" : @(SexFemale),
@"gay" : @"true"
// @"gay" : @"1"
// @"gay" : @"NO"
};
// JSON -> User
User *user = [User mj_objectWithKeyValues:dict];
NSLog(@"name=%@, icon=%@, age=%zd, height=%@, money=%@, sex=%d, gay=%d", user.name, user.icon, user.age, user.height, user.money, user.sex, user.gay);
// name=Jack, icon=lufy.png, age=20, height=1.550000, money=100.9, sex=1
JSONString -> ModelãJSONå符串转模åã
// 1.Define a JSONString
NSString *jsonString = @"{\"name\":\"Jack\", \"icon\":\"lufy.png\", \"age\":20}";
// 2.JSONString -> User
User *user = [User mj_objectWithKeyValues:jsonString];
// 3.Print user's properties
NSLog(@"name=%@, icon=%@, age=%d", user.name, user.icon, user.age);
// name=Jack, icon=lufy.png, age=20
Model contains modelã模åä¸åµå¥æ¨¡åã
@interface Status : NSObject
@property (copy, nonatomic) NSString *text;
@property (strong, nonatomic) User *user;
@property (strong, nonatomic) Status *retweetedStatus;
@end
/***********************************************/
NSDictionary *dict = @{
@"text" : @"Agree!Nice weather!",
@"user" : @{
@"name" : @"Jack",
@"icon" : @"lufy.png"
},
@"retweetedStatus" : @{
@"text" : @"Nice weather!",
@"user" : @{
@"name" : @"Rose",
@"icon" : @"nami.png"
}
}
};
// JSON -> Status
Status *status = [Status mj_objectWithKeyValues:dict];
NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
// text=Agree!Nice weather!, name=Jack, icon=lufy.png
NSString *text2 = status.retweetedStatus.text;
NSString *name2 = status.retweetedStatus.user.name;
NSString *icon2 = status.retweetedStatus.user.icon;
NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);
// text2=Nice weather!, name2=Rose, icon2=nami.png
Model contains model-arrayã模åä¸æ个æ°ç»å±æ§ï¼æ°ç»éé¢åè¦è£ çå ¶ä»æ¨¡åã
@interface Ad : NSObject
@property (copy, nonatomic) NSString *image;
@property (copy, nonatomic) NSString *url;
@end
@interface StatusResult : NSObject
/** Contatins status model */
@property (strong, nonatomic) NSMutableArray *statuses;
/** Contatins ad model */
@property (strong, nonatomic) NSArray *ads;
@property (strong, nonatomic) NSNumber *totalNumber;
@end
/***********************************************/
// Tell MJExtension what type of model will be contained in statuses and ads.
[StatusResult mj_setupObjectClassInArray:^NSDictionary *{
return @{
@"statuses" : @"Status",
// @"statuses" : [Status class],
@"ads" : @"Ad"
// @"ads" : [Ad class]
};
}];
// Equals: StatusResult.m implements +mj_objectClassInArray method.
NSDictionary *dict = @{
@"statuses" : @[
@{
@"text" : @"Nice weather!",
@"user" : @{
@"name" : @"Rose",
@"icon" : @"nami.png"
}
},
@{
@"text" : @"Go camping tomorrow!",
@"user" : @{
@"name" : @"Jack",
@"icon" : @"lufy.png"
}
}
],
@"ads" : @[
@{
@"image" : @"ad01.png",
@"url" : @"http://www.ad01.com"
},
@{
@"image" : @"ad02.png",
@"url" : @"http://www.ad02.com"
}
],
@"totalNumber" : @"2014"
};
// JSON -> StatusResult
StatusResult *result = [StatusResult mj_objectWithKeyValues:dict];
NSLog(@"totalNumber=%@", result.totalNumber);
// totalNumber=2014
// Printing
for (Status *status in result.statuses) {
NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
}
// text=Nice weather!, name=Rose, icon=nami.png
// text=Go camping tomorrow!, name=Jack, icon=lufy.png
// Printing
for (Ad *ad in result.ads) {
NSLog(@"image=%@, url=%@", ad.image, ad.url);
}
// image=ad01.png, url=http://www.ad01.com
// image=ad02.png, url=http://www.ad02.com
Model name - JSON key mappingã模åä¸çå±æ§åååå ¸ä¸çkeyä¸ç¸å(æè éè¦å¤çº§æ å°)ã
@interface Bag : NSObject
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) double price;
@end
@interface Student : NSObject
@property (copy, nonatomic) NSString *ID;
@property (copy, nonatomic) NSString *desc;
@property (copy, nonatomic) NSString *nowName;
@property (copy, nonatomic) NSString *oldName;
@property (copy, nonatomic) NSString *nameChangedTime;
@property (strong, nonatomic) Bag *bag;
@end
/***********************************************/
// How to map
[Student mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{
@"ID" : @"id",
@"desc" : @"description",
@"oldName" : @"name.oldName",
@"nowName" : @"name.newName",
@"nameChangedTime" : @"name.info[1].nameChangedTime",
@"bag" : @"other.bag"
};
}];
// Equals: Student.m implements +mj_replacedKeyFromPropertyName method.
NSDictionary *dict = @{
@"id" : @"20",
@"description" : @"kids",
@"name" : @{
@"newName" : @"lufy",
@"oldName" : @"kitty",
@"info" : @[
@"test-data",
@{
@"nameChangedTime" : @"2013-08"
}
]
},
@"other" : @{
@"bag" : @{
@"name" : @"a red bag",
@"price" : @100.7
}
}
};
// JSON -> Student
Student *stu = [Student mj_objectWithKeyValues:dict];
// Printing
NSLog(@"ID=%@, desc=%@, oldName=%@, nowName=%@, nameChangedTime=%@",
stu.ID, stu.desc, stu.oldName, stu.nowName, stu.nameChangedTime);
// ID=20, desc=kids, oldName=kitty, nowName=lufy, nameChangedTime=2013-08
NSLog(@"bagName=%@, bagPrice=%f", stu.bag.name, stu.bag.price);
// bagName=a red bag, bagPrice=100.700000
JSON array -> model arrayãå°ä¸ä¸ªåå ¸æ°ç»è½¬æ模åæ°ç»ã
NSArray *dictArray = @[
@{
@"name" : @"Jack",
@"icon" : @"lufy.png"
},
@{
@"name" : @"Rose",
@"icon" : @"nami.png"
}
];
// JSON array -> User array
NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];
// Printing
for (User *user in userArray) {
NSLog(@"name=%@, icon=%@", user.name, user.icon);
}
// name=Jack, icon=lufy.png
// name=Rose, icon=nami.png
Model -> JSONãå°ä¸ä¸ªæ¨¡å转æåå ¸ã
// New model
User *user = [[User alloc] init];
user.name = @"Jack";
user.icon = @"lufy.png";
Status *status = [[Status alloc] init];
status.user = user;
status.text = @"Nice mood!";
// Status -> JSON
NSDictionary *statusDict = status.mj_keyValues;
NSLog(@"%@", statusDict);
/*
{
text = "Nice mood!";
user = {
icon = "lufy.png";
name = Jack;
};
}
*/
// More complex situation
Student *stu = [[Student alloc] init];
stu.ID = @"123";
stu.oldName = @"rose";
stu.nowName = @"jack";
stu.desc = @"handsome";
stu.nameChangedTime = @"2018-09-08";
Bag *bag = [[Bag alloc] init];
bag.name = @"a red bag";
bag.price = 205;
stu.bag = bag;
NSDictionary *stuDict = stu.mj_keyValues;
NSLog(@"%@", stuDict);
/*
{
ID = 123;
bag = {
name = "\U5c0f\U4e66\U5305";
price = 205;
};
desc = handsome;
nameChangedTime = "2018-09-08";
nowName = jack;
oldName = rose;
}
*/
Model array -> JSON arrayãå°ä¸ä¸ªæ¨¡åæ°ç»è½¬æåå ¸æ°ç»ã
// New model array
User *user1 = [[User alloc] init];
user1.name = @"Jack";
user1.icon = @"lufy.png";
User *user2 = [[User alloc] init];
user2.name = @"Rose";
user2.icon = @"nami.png";
NSArray *userArray = @[user1, user2];
// Model array -> JSON array
NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray];
NSLog(@"%@", dictArray);
/*
(
{
icon = "lufy.png";
name = Jack;
},
{
icon = "nami.png";
name = Rose;
}
)
*/
Core Data
func json2CoreDataObject() {
context.performAndWait {
let object = MJCoreDataTester.mj_object(withKeyValues: Values.testJSONObject, context: context)
// use the object
}
}
func coreDataObject2JSON() {
context.performAndWait {
let dict = coreDataObject.mj_keyValues()
// use dict
}
}
Coding (Archive & Unarchive methods are deprecated in iOS 12)
#import "MJExtension.h"
@implementation MJBag
// NSCoding Implementation
MJCodingImplementation
@end
/***********************************************/
// what properties not to be coded
[MJBag mj_setupIgnoredCodingPropertyNames:^NSArray *{
return @[@"name"];
}];
// Equals: MJBag.m implements +mj_ignoredCodingPropertyNames method.
// Create model
MJBag *bag = [[MJBag alloc] init];
bag.name = @"Red bag";
bag.price = 200.8;
NSString *file = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/bag.data"];
// Encoding by archiving
[NSKeyedArchiver archiveRootObject:bag toFile:file];
// Decoding by unarchiving
MJBag *decodedBag = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
NSLog(@"name=%@, price=%f", decodedBag.name, decodedBag.price);
// name=(null), price=200.800000
Secure Coding
Using MJSecureCodingImplementation(class, isSupport)
macro.
@import MJExtension;
// NSSecureCoding Implementation
MJSecureCodingImplementation(MJBag, YES)
@implementation MJBag
@end
/***********************************************/
// what properties not to be coded
[MJBag mj_setupIgnoredCodingPropertyNames:^NSArray *{
return @[@"name"];
}];
// Equals: MJBag.m implements +mj_ignoredCodingPropertyNames method.
// Create model
MJBag *bag = [[MJBag alloc] init];
bag.name = @"Red bag";
bag.price = 200.8;
bag.isBig = YES;
bag.weight = 200;
NSString *file = [NSTemporaryDirectory() stringByAppendingPathComponent:@"bag.data"];
NSError *error = nil;
// Encoding by archiving
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:bag requiringSecureCoding:YES error:&error];
[data writeToFile:file atomically:true];
// Decoding by unarchiving
NSData *readData = [NSFileManager.defaultManager contentsAtPath:file];
error = nil;
MJBag *decodedBag = [NSKeyedUnarchiver unarchivedObjectOfClass:MJBag.class fromData:readData error:&error];
MJExtensionLog(@"name=%@, price=%f", decodedBag.name, decodedBag.price);
Camel -> underlineãç»ä¸è½¬æ¢å±æ§åï¼æ¯å¦é©¼å³°è½¬ä¸å线ï¼ã
// Dog
#import "MJExtension.h"
@implementation Dog
+ (NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName
{
// nickName -> nick_name
return [propertyName mj_underlineFromCamel];
}
@end
// NSDictionary
NSDictionary *dict = @{
@"nick_name" : @"æºè´¢",
@"sale_price" : @"10.5",
@"run_speed" : @"100.9"
};
// NSDictionary -> Dog
Dog *dog = [Dog mj_objectWithKeyValues:dict];
// printing
NSLog(@"nickName=%@, scalePrice=%f runSpeed=%f", dog.nickName, dog.salePrice, dog.runSpeed);
NSString -> NSDate, nil -> @""ãè¿æ»¤åå ¸çå¼ï¼æ¯å¦å符串æ¥æå¤ç为NSDateãå符串nilå¤ç为@""ï¼ã
// Book
#import "MJExtension.h"
@implementation Book
- (id)mj_newValueFromOldValue:(id)oldValue property:(MJProperty *)property
{
if ([property.name isEqualToString:@"publisher"]) {
if (oldValue == nil) return @"";
} else if (property.type.typeClass == [NSDate class]) {
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
return [fmt dateFromString:oldValue];
}
return oldValue;
}
@end
// NSDictionary
NSDictionary *dict = @{
@"name" : @"5åéçªç ´iOSå¼å",
@"publishedTime" : @"2011-09-10"
};
// NSDictionary -> Book
Book *book = [Book mj_objectWithKeyValues:dict];
// printing
NSLog(@"name=%@, publisher=%@, publishedTime=%@", book.name, book.publisher, book.publishedTime);
NSDate -> NSStringã模å转åå ¸æ¶, ä¿®æ¹ Date ç±»åè³ Stringã
- (void)mj_objectDidConvertToKeyValues:(NSMutableDictionary *)keyValues {
// NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// formatter.dateFormat = @"yyy-MM-dd";
// should use sharedFormatter for better performance
keyValues[@"publishedTime"] = [sharedFormatter stringFromDate:self.publishedTime];
}
More use casesãæ´å¤ç¨æ³ã
- Please reference to
NSObject+MJKeyValue.h
andNSObject+MJCoding.h
æå¾
- å¦æå¨ä½¿ç¨è¿ç¨ä¸éå°BUGï¼å¸æä½ è½Issuesæï¼è°¢è°¢ï¼æè å°è¯ä¸è½½ææ°çæ¡æ¶ä»£ç ççBUGä¿®å¤æ²¡æï¼
- å¦æå¨ä½¿ç¨è¿ç¨ä¸åç°åè½ä¸å¤ç¨ï¼å¸æä½ è½Issuesæï¼æé常æ³ä¸ºè¿ä¸ªæ¡æ¶å¢å æ´å¤å¥½ç¨çåè½ï¼è°¢è°¢
- å¦æä½ æ³ä¸ºMJExtensionè¾åºä»£ç ï¼è¯·æ¼å½Pull Requestsæ
Top Related Projects
A delightful networking framework for iOS, macOS, watchOS, and tvOS.
Model framework for Cocoa and Cocoa Touch
Magical Data Modeling Framework for JSON - allows rapid creation of smart data models. You can use it in your iOS, macOS, watchOS and tvOS apps.
The better way to deal with JSON data in Swift.
Elegant HTTP Networking in Swift
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot