[Desarrollo de iOS] Uso de JSONModel

1. ¿Qué es JSONModel?

JSONModel es una biblioteca de código abierto de terceros para convertir json en modelo. Después de enviar una solicitud al servidor, podemos usar JSONModel para convertir los datos en atributos en el modelo.

En segundo lugar, el método de uso más básico de JSONModel
Tome los datos json más simples solicitados por la API de verificación de versión como ejemplo
Inserte la descripción de la imagen aquí

La versión enviada es la versión 2.3, entonces los datos json en este momento son

Inserte la descripción de la imagen aquí

Estos son los datos json
que obtenemos de la solicitud de red. Nuestros siguientes pasos son:

  1. Cree una clase de modelo, esta clase se hereda de JSONModel
  2. Declare los datos json solicitados como atributos en el archivo .h, no hay necesidad de hacer otras cosas en el archivo .m temporalmente (si está involucrado el anidamiento, habrá otros)
#import "JSONModel.h"

NS_ASSUME_NONNULL_BEGIN
@interface TestModel : JSONModel
@property (nonatomic, assign) int status;
@property (nonatomic, copy) NSString* msg;
@property (nonatomic, copy) NSString* latest;

@end

NS_ASSUME_NONNULL_END
  1. Inicializar el modelo con los datos solicitados a la red
- (void)viewDidLoad {
    
    
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSString* json = @"http://news-at.zhihu.com/api/4/version/ios/2.3.0";
    json = [json stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    NSURL *testUrl = [NSURL URLWithString:json];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testUrl];
    NSURLSession *testSession = [NSURLSession sharedSession];
    NSURLSessionDataTask *testDataTask = [testSession dataTaskWithRequest:testRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
    
    //这个TestModel就是上面说到的类
            TestModel* country = [[TestModel alloc] initWithData:data error:nil];
        NSLog(@"%@",country);
        }];
    //任务启动
        [testDataTask resume];
}

Si el JSON pasado es válido, todos los atributos que defina corresponderán al valor del JSON, e incluso JSONModel intentará convertir los datos al tipo que espera. La clase JSONValueTransformer puede ayudarnos a hacer muchas conversiones de la siguiente manera:

NSMutableString <-> NSString
NSMutableArray <-> NSArray
NS(Mutable)Array <- JSONModelArray
NSMutableDictionary <-> NSDictionary
NSSet <-> NSArray
BOOL <-> number/string
string <-> number
string <-> url
string <-> time zone
string <-> date
number <-> date

En este punto podemos ver la salida
Inserte la descripción de la imagen aquí

Tres, recopilación, datos anidados

Aún conozco una solicitud de la API
Inserte la descripción de la imagen aquí

Los datos esta vez son muy complicados. Tiene anidamientos y arreglos. ¿Cómo debemos manejar este modelo anidado? Deberíamos escribir una clase para cada una de ellas a anidar, pero eso no significa que tengamos que escribir varios archivos de clase, sino que solo necesitamos escribir lo que debería estar en un archivo de clase para alinear el siguiente código:

//
//  TestModel.h
//  JSONModel
//
//  Created by young_jerry on 2020/10/12.
//
@protocol StoriesModel
@end

@protocol Top_StoriesModel
@end

#import "JSONModel.h"

NS_ASSUME_NONNULL_BEGIN
@interface StoriesModel : JSONModel
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *image_hue;
@property (nonatomic, copy) NSString *id;
@end

@interface Top_StoriesModel : JSONModel
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *image_hue;
@property (nonatomic, copy) NSString *id;
@end

@interface TestModel : JSONModel
@property (nonatomic, copy) NSString *date;
@property (nonatomic, copy) NSArray<StoriesModel>* stories;
@property (nonatomic, copy) NSArray<Top_StoriesModel>* top_stories;
//
//@property (nonatomic, assign) int status;
//@property (nonatomic, copy) NSString *msg;
//@property (nonatomic, copy) NSString *latest;

@end

NS_ASSUME_NONNULL_END

En el archivo .m tenemos que completar la realización de la clase, de lo contrario se reportará un error

#import "TestModel.h"
@implementation Top_StoriesModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
    
    
    return YES;
}
@end

@implementation StoriesModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
    
    
    return YES;
}
@end

@implementation TestModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
    
    
    return YES;
}
@end

Imprimimos el valor del primer conjunto de top_stories después de que finaliza la asignación de solicitud de red, podemos ver que la adquisición se ha realizado correctamente
Inserte la descripción de la imagen aquí

Cuatro puntos a tener en cuenta

  1. + (BOOL) propertyIsOptional: (NSString *) propertyName no quiere bloquear el programa porque un cierto valor del servidor no devuelve (nil). Agregaremos la palabra clave Opcional. Si no queremos agregar todas las propiedades, también podemos usarla. El método de reescritura en el archivo m es un método de reescritura. Por
    ejemplo, si la versión de msg de la primera API está actualizada, entonces msg no tiene valor de retorno. Si no lo escribe, el programa fallará

  2. Cuando escribí la demostración por primera vez, todo estaba correcto, pero la solicitud de red falló
    Inserte la descripción de la imagen aquí

Se encontró la siguiente información:
iOS9 introdujo una nueva característica: App Transport Security (ATS), que requiere que la red a la que se accede en la aplicación debe usar el protocolo HTTPS.

Pero ahora el proyecto de la compañía usa el protocolo HTTP, usando encriptación privada para garantizar la seguridad de los datos. Ahora no se puede cambiar a la transmisión del protocolo HTTPS de inmediato.

Finalmente encontré la siguiente solución:

Agregue lo siguiente en Información
Inserte la descripción de la imagen aquí

  1. ¿Cómo puedo obtener los elementos en la matriz de mosaico?
    Puede ver que la sintaxis de puntos no funciona. Debido a que es un modelo anidado, no se puede llamar directamente.Inserte la descripción de la imagen aquí

Podemos declarar el modelo anidado que necesitamos y luego asignarle un valor, y podemos llamarlo directamente.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

  1. La asignación de claves global de configuración de claves (aplicada a todos los modelos)
    en el archivo .m es cambiar el nombre de la variable
    :
    Inserte la descripción de la imagen aquí

  2. Convierta automáticamente nombres subrayados en atributos de nombres de casos de camello. Existe un método similar, como mayúsculas a minúsculas: mapperFromUpperCaseToLowerCase

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_46110288/article/details/109102891
Recomendado
Clasificación