首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jSONEncoder的自定义结构

使用jSONEncoder的自定义结构
EN

Stack Overflow用户
提问于 2018-02-10 06:52:14
回答 1查看 243关注 0票数 0

希望使用JSONEncoder+Encodable将对象编码为自定义结构。

代码语言:javascript
复制
struct Foo: Encodable {
   var name: String?
   var bars: [Bar]?
}

struct Bar: Encodable {
   var name: String?
   var value: String?
}

let bar1 = Bar(name: "bar1", value: "barvalue1")
let bar2 = Bar(name: "bar2", value: "barvalue2")
let foo = Foo(name: "foovalue", bars: [bar1, bar2])

foo的默认编码方法提供:

代码语言:javascript
复制
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(foo)
print(String(data: data, encoding: .utf8)!)

输出:

代码语言:javascript
复制
{
   "name": "foovalue",
   "bars": [
      {
         "name": "bar1",
         "value": "barvalue1"
      },
      {
         "name": "bar2",
         "value": "barvalue2"
      }
   ]
}

在自定义输出中,我希望使用属性name的值作为键,使用rest值作为上述键的值。这同样适用于嵌套对象。所以我希望输出是:

代码语言:javascript
复制
{
    "foovalue": [
       {
          "bar1": "barvalue1"
       },
       {
          "bar2": "barvalue2"
       }
     ]
}

问题是Encodable/JSONEncoder是否支持这一点。现在,我只需要处理第一个输出字典,并通过迭代键来重新构造它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-10 08:09:23

如果您希望保留FooBar Encodable,则可以通过提供自定义encode(to:)来实现这一点,该encode(to:)使用值为name的特定编码键

代码语言:javascript
复制
private struct StringKey: CodingKey {
    let stringValue: String
    var intValue: Int? { return nil }
    init(_ string: String) { stringValue = string }
    init?(stringValue: String) { self.init(stringValue) }
    init?(intValue: Int) { return nil }
}

struct Foo: Encodable {
    var name: String
    var bars: [Bar]

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: StringKey.self)
        try container.encode(bars, forKey: StringKey(name))
    }
}

struct Bar : Encodable {
    var name: String
    var value: String

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: StringKey.self)
        try container.encode(value, forKey: StringKey(name))
    }
}

StringKey可以接受任何String值,允许根据需要任意编码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48718091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档