2016-02-08 18 views
0

Я использую SwiftyJSON для сериализации/десериализации данных JSON при общении с EntityFramework. Проблема в том, что для некоторых конечных точек EF ожидает увидеть атрибут «__type», чтобы правильно сопоставить его с классом .NET в бэкэнд. И этот атрибут «__type» должен быть быть самым первым атрибутом объекта JSON.SwiftyJSON порядок элементов внутри объекта JSON

Вот пример рабочей полезной нагрузки:

"changeSet" : [ 
    { 
     "OriginalEntity" : { 
     "__type" : "outside_vendors_to_events:#QPWebOffice.Web", 
     "revenue" : 0, 
     "transactions_count" : 23, 
     "id" : 8, 
     "vendor" : "New", 
     "event_id" : 4 
     }, 
     "Operation" : 3, 
     "Entity" : { 
     "__type" : "outside_vendors_to_events:#QPWebOffice.Web", 
     "revenue" : 0, 
     "transactions_count" : 2, 
     "id" : 8, 
     "vendor" : "New", 
     "event_id" : 4 
     }, 
     "Id" : 0 
    } 
    ] 

Это работает отлично. Но если по какой-то причине __type будет двигаться ниже в объекте - сервер терпит неудачу. Теперь я знаю, что вы не можете гарантировать порядок элементов в словаре, но как еще это можно выработать?

Я создаю объект JSON в Swift, как это:

return JSON([ 
    "__type": "outside_vendors_to_events:#QPWebOffice.Web", 
    "event_id": eventId, 
    "id": id, 
    "revenue": revenue, 
    "transactions_count": transactionCount, 
    "vendor": name == nil ? NSNull() : name! 
]) 

Порядок, кажется, так же всегда, но это разные для разных классов у меня есть в приложении. И для некоторых из них - независимо от того, что я делаю - «__type» окажется в середине свойств JSON.

Любая идея была бы принята с благодарностью. И нет, я не могу изменить сервер.

ответ

1

Словари по дизайну нестабильны при заказе на размещение (порядок вставки не имеет значения при использовании итерирующих клавиш) EF, возможно, нарушен в требовании порядка объектов JS, что также не указывается. Тем не менее, вы могли бы решить проблему, используя что-то вроде ответов на этот вопрос: Insertion-Order Dictionary (like Java's LinkedHashMap) in Swift?. Если вы не согласны с этим, вам нужно будет настроить вашу операцию сериализации (независимо от того, что превращает ваш словарь в JSON) в особый случай.

+0

Спасибо. Поскольку это только JSON -> String serialization, я закончил вручную создание строки из моего объекта JSON. Я ненавижу это, но это, кажется, самый простой выход из этого беспорядка. – sha

+1

При работе со сломанными технологиями, часто лучше быть прагматичным :) –