es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Decodificar la cadena HTML de un JSON

¿Cómo puedo decodificar esta cadena?

"<div id="\"readability-page-1\"" class="\"page\"">test<div>"

Recibo este objeto de una API y quiero decodificarlo en una estructura:

{
    "id": 5,
    "title": "iOS and iPadOS 14: The MacStories Review",
    "content": "<div id="\"readability-page-1\"" class="\"page\"">test<div>"
}

Estructura de modelo de artículo:

struct ArticleModel: Codable, Identifiable {
    let id: Int
    let title: String
    let content: String
}

Sin embargo, esto arroja el siguiente error:

debugDescription: "Los datos dados no eran un JSON válido."
    ▿ underlyingError: Optional<error>
      - some: Error Domain=NSCocoaErrorDomain Code=3840 "Objeto mal formado alrededor de la línea 45, columna 25." UserInfo={NSDebugDescription=Objeto mal formado alrededor de la línea 45, columna 25., NSJSONSerializationErrorIndex=1437}

¿Cómo puedo escapar los caracteres especiales \”?

Quiero mostrar la cadena en una vista como una cadena de atributos.

Prueba a través del playground

“`swift
import UIKit

let json = """
{
"id": 5,
"title": "iOS and iPadOS 14: The MacStories Review",
"content": "

<div id="\"readability-page-1\"" class="\"page\"">test<div>"
}
"""

struct ArticleModel: Codable, Identifiable {
let id: Int
let title: String
let content: String
}

let jsonData = json.data(using: .utf8)!
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let article = try decoder.decode(ArticleModel.self, from: jsonData)
print(article)
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para decodificar la cadena JSON proporcionada, debes escapar correctamente los caracteres " con su respectivo valor unicode \u{0022}. La cadena JSON actualizada se vería así:

    {
        "id": 5,
        "title": "iOS and iPadOS 14: The MacStories Review",
        "content": "<div id="\"readability-page-1\"" class="\"page\"">test<div>"
    }
    

    Una vez que la cadena JSON esté correctamente formateada, puedes decodificarla en la estructura ArticleModel de la siguiente manera:

    let json = """
    {
        "id": 5,
        "title": "iOS and iPadOS 14: The MacStories Review",
        "content": "<div id="\\"readability-page-1\\"" class="\\"page\\"">test<div>"
    }
    """
    
    struct ArticleModel: Codable, Identifiable {
        let id: Int
        let title: String
        let content: String
    }
    
    let jsonData = json.data(using: .utf8)!
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    
    do {
        let article = try decoder.decode(ArticleModel.self, from: jsonData)
        print(article)
    } catch {
        print(error)
    }
    

    Para mostrar la propiedad content como una cadena atribuida en una vista, puedes usar NSAttributedString y reemplazar las etiquetas HTML con sus respectivos atributos. Aquí tienes un ejemplo:

    “`swift
    let htmlContent = article.content
    let modifiedContent = htmlContent.replacingOccurrences(of: “<[^>]+>”, with: “”, options: .regularExpression, range: nil)
    let attributedString = NSAttributedString(string: modifiedContent)

    // Usa attributedString en tu vista
    “`

Comments are closed.