2016-07-28 3 views
1

Мы пытаемся перейти от SOAP к REST, и мы наткнулись на этот вопрос Здесь сторона может быть типа Individual или Organization.JSON и наследование объектов

Примеры XMLs

<customer> 
    <details> 
    <party xsi:type="Individual"> 
     <externalID>ABC123</externalID> 
     <firstname>John</firstname> 
     <lastname>Smith</lastname> 
    </party> 
    </details> 
</customer> 

<customer> 
    <details> 
    <party xsi:type="Organization"> 
     <externalID>APPLE</externalID> 
     <organizationName>Apple Inc</organizationName> 
     <listingName>APPLE</listingName> 
    </party> 
    </details> 
</customer> 

Однако, когда мы переходим к JSON представления одного и того же, мы сталкиваемся с проблемой, когда информация наследство теряется

JSON Sample

{ 
    "customer": { 
    "details": { 
     "party": { 
     "externalID": "ABC123", 
     "firstname": "John", 
     "lastname": "Smith" 
     } 
    } 
    } 
} 

{ 
    "customer": { 
    "details": { 
     "party": { 
     "externalID": "APPLE", 
     "organizationName": "Apple Inc", 
     "listingName": "APPLE" 
     } 
    } 
    } 
} 

Так что, когда мы преобразовать JSON обратно в объект Java, используя библиотеки, такие как Gson, мы теряем определение Individual или Organization.

Хотя одним из способов решения проблемы является создание дополнительных сервисов для получения «деталей», возвращающих конкретные типы (индивидуальные или организационные), есть ли какой-либо другой подход для обработки этого в JSON?

+0

Это, как представляется, дублирует вопрос. Я думаю, что это то, что вы ищете: http://stackoverflow.com/questions/33627344/equal-of-xsitype-in-json-schema –

ответ

0

Вы можете написать собственный десериализатор Gson и на основе существования поля organisationName вы создаете экземпляр класса Organization или Individual в этом десериализаре. Что-то вроде того, что указано здесь: Gson - deserialization to specific object type based on field value, вместо «type» вы можете проверить наличие вашего имущества.

0

Я нашел ресурс, предоставленный IBM, и почувствовал, что это может помочь. Это связано ниже.

На стр. 27 они преобразовывают:

<year xsi:type="xs:positiveInteger">1989</year> 

To:

{ "xsi:type" : "xs:positiveInteger", value : 1989 } 

Таким образом, я думаю, что ваш код должен преобразовать:

{ 
    "customer": { 
    "details": { 
     "party": { 
     "xsi:type": "Individual", 
     "externalID": "ABC123", 
     "firstname": "John", 
     "lastname": "Smith" 
     } 
    } 
    } 
} 

{ 
    "customer": { 
    "details": { 
     "party": { 
     "xsi:type": "Organization", 
     "externalID": "APPLE", 
     "organizationName": "Apple Inc", 
     "listingName": "APPLE" 
     } 
    } 
    } 
} 

ресурс для справки: https://www.w3.org/2011/10/integration-workshop/s/ExperienceswithJSONandXMLTransformations.v08.pdf

1

Это было возможно комбинируйте схемы с использованием таких ключевых слов, как oneOf, allOf, anyOf и получите полезную нагрузку, подтвержденную с JSON sch ema v1.0.

https://spacetelescope.github.io/understanding-json-schema/reference/combining.html

Однако композиция была повышена с помощью ключевого слова дискриминатора включены в OpenAPI (бывший Swagger) едва поддерживать полиморфизм. В OpenAPI 3.0 эта поддержка была дополнена добавлением ключевого слова oneOf.

Ваше наследование может быть смоделировано с использованием комбинации oneOf (для выбора одного из дочерних элементов) и allOf (для объединения родительского и дочернего).

paths: 
    /customers: 
    post: 
    requestBody: 
    content: 
     application/json: 
     schema: 
      oneOf: 
      - $ref: '#/components/schemas/Individual 
      - $ref: '#/components/schemas/Organization 
      discriminator: 
      propertyName: customer_type 
    responses: 
    '201': 
     description: Created 
components: 
    schemas: 
    Customer: 
     type: object 
     required: 
     - customer_type 
     - externalID 
     properties: 
     customer_type: 
      type: string 
     externalID: 
      type: integer 
     discriminator: 
     property_name: customer_type 
    Individual: 
     allOf: 
     - $ref: "#/components/schemas/Customer" 
     - type: object 
     - properties: 
      firtName 
      type: string 
      lastName 
      type: string 
    Organisation: 
     allOf: 
     - $ref: "#/components/schemas/Customer" 
     - type: object 
     - properties: 
      organisationName 
      type: string 
      listingName 
      type: string 

https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#schemaComposition

+0

Это правда, что OAS позволяет это. Тем не менее, поддержка функции не отображается в пользовательском интерфейсе Swagger ([link] (https: // github.com/swagger-api/swagger-ui/issues/2438)), и я думаю, что функция имеет ограниченное использование, если вы не можете показать ее кому-либо. – emft

Смежные вопросы