Skip to content

The JSONEncoder encode Dictionary to Array? #63778

Open
@Xezun

Description

@Xezun
struct Name: RawRepresentable, Codable, Hashable {
    typealias RawValue = String
    var rawValue: String
    init(rawValue: String) {
        self.rawValue = rawValue
    }
    var hashValue: Int {
        return rawValue.hashValue
    }
    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        let rawValue = try container.decode(String.self)
        self.init(rawValue: rawValue)
    }
    
    func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encode(rawValue)
    }
}

let value0 = Name.init(rawValue: "Name")
let encoder0 = JSONEncoder()
if let data = try? encoder0.encode(value0) {
    if let string = String(data: data, encoding: .utf8) {
        print(string) // ✅ prints: "Name"
    }
}

let value1 = [Name.init(rawValue: "Name"): "John"]
let encoder1 = JSONEncoder()
if let data = try? encoder1.encode(value1) {
    if let string = String(data: data, encoding: .utf8) {
        print(string) // ❌ prints: ["Name","John"]
    }
}

let value2 = ["Name": Name.init(rawValue: "John")]
let encoder2 = JSONEncoder()
if let data = try? encoder2.encode(value2) {
    if let string = String(data: data, encoding: .utf8) {
        print(string) // ✅ prints: {"Name":"John"}
    }
}

Environment

  • Swift compiler version info
  • Xcode version info Xcode 14.2 Build version 14C18
  • Deployment target: iOS
  • swift-driver version: 1.62.15 Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51)

Metadata

Metadata

Assignees

No one assigned

    Labels

    FoundationbugA deviation from expected or documented behavior. Also: expected but undesirable behavior.not a bugResolution → not a bug: Reported as a bug but turned out to be expected behavior or programmer errorswift 5.7transfer candidateThe issue may belong in another repository

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions