18

MTLModel から継承する MyModel があります (GitHub Mantle ポッドを使用)。MyModel.h

#import <Mantle/Mantle.h>
@interface MyModel : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy, readonly) NSString *UUID;
@property (nonatomic, copy) NSString *someProp;
@property (nonatomic, copy) NSString *anotherProp;
@end

MyModel.m

#import "MyModel.h"
@implementation MyModel
+ (NSDictionary *)JSONKeyPathsByPropertyKey
{
        return @{
            @"UUID": @"id",
            @"someProp": @"some_prop",
            @"anotherProp": @"another"
    };
}
}
@end

次に、AFNetworking を使用して JSON をバックエンドに送信します。その前に、モデル インスタンスを JSON NSDictionary に変換して、リクエスト内でパラメーター/ボディ ペイロードとして使用します。

NSDictionary *JSON = [MTLJSONAdapter JSONDictionaryFromModel:myModel];

しかし、この JSON は、nil である私のモデルのプロパティの奇妙な "" 文字列で構成されています。代わりに、Mantle がこれらのキーと値のペアを省略し、nil や NSNull.null 以外のプロパティのみを含む JSON を吐き出すようにする必要があります。

4

4 に答える 4

2

MTLJSONAdapter サブクラスを作成し、メソッドをオーバーライドして、nil 値のキーを削除します-serializablePropertyKeys:forModel:

MTLJSONAdapterWithoutNil.h

/** A MTLJSONAdapter subclass that removes model dictionaryValue keys whose value is `[NSNull null]`. */
@interface MTLJSONAdapterWithoutNil : MTLJSONAdapter
@end

MTLJSONAdapterWithoutNil.m

#import "MTLJSONAdapterWithoutNil.h"

@implementation MTLJSONAdapterWithoutNil

- (NSSet *)serializablePropertyKeys:(NSSet *)propertyKeys forModel:(id<MTLJSONSerializing>)model {
    NSMutableSet *ms = propertyKeys.mutableCopy;
    NSDictionary *modelDictValue = [model dictionaryValue];
    for (NSString *key in ms) {
        id val = [modelDictValue valueForKey:key];
        if ([[NSNull null] isEqual:val]) { // MTLModel -dictionaryValue nil value is represented by NSNull
            [ms removeObject:key];
        }
    }
    return [NSSet setWithSet:ms];
}

@end

これを使用して、代わりに JSON 辞書を作成します。このような:

NSDictionary *JSONDictionary = [MTLJSONAdapterWithoutNil JSONDictionaryFromModel:collection error:nil];

注:配列または辞書プロパティのメソッドを オーバーライドする場合は、クラスもサブクラスNSValueTransformerに変更する必要があります。MTLJSONAdapterこのような:

+ (NSValueTransformer *)myDailyDataArrayJSONTransformer {
    return [MTLJSONAdapterWithoutNil arrayTransformerWithModelClass:KBDailyData.class];
}
于 2015-06-29T08:11:29.523 に答える
0

オーバーライド - DictionaryValues で期待どおりの動作が得られなかった

そこで、MTL Base クラスのメソッドを作成しました

    - (NSDictionary *)nonNullDictionaryWithAdditionalParams:(NSDictionary *)params error:(NSError *)error {
        NSDictionary *allParams = [MTLJSONAdapter JSONDictionaryFromModel:self error: &error];
        NSMutableDictionary *modifiedDictionaryValue = [allParams mutableCopy];

        for (NSString *originalKey in allParams) {
            if ([allParams objectForKey:originalKey] == NSNull.null) {
                [modifiedDictionaryValue removeObjectForKey:originalKey];
            }
        }

        [modifiedDictionaryValue addEntriesFromDictionary:params];
        return [modifiedDictionaryValue copy];
    }
于 2015-11-11T19:05:42.900 に答える
-1

EDIT#2は、以前のMantleコードベースで機能していました。EDIT#2を引き続き使用するには、次のことを行う必要があります。

ファイル MTLJSONAdapter.m で、次の行を置き換えます。

NSDictionary *dictionaryValue = [model.dictionaryValue dictionaryWithValuesForKeys:propertyKeysToSerialize.allObjects];

NSDictionary *dictionaryValue = model.dictionaryValue;

上記は、取得するための現在の回避策です

{ }

それ以外の

{
  "AddressLine2" : null,
  "City" : null,
  "ZipCode" : null,
  "State" : null,
  "AddressLine1" : null
}
于 2015-05-28T22:47:49.187 に答える