infinum / japx Goto Github PK
View Code? Open in Web Editor NEWLightweight parser for the complex JSON:API (http://jsonapi.org/) structure.
License: MIT License
Lightweight parser for the complex JSON:API (http://jsonapi.org/) structure.
License: MIT License
Hello, can u add integration with Moya?
pin gist https://gist.github.com/Draiseen/cfc1f8e16ff7a6076868e27d29c9020a
New Xcode complains that flatMap is deprecated, so this ought to be fixed. I replaced the flatMap calls with compactMap, but not sure if this was the intended use of flatMap in these cases.
If a JSON with relationships already determined, but the related item not stored in included
, it will be decoded as null.
Is it the correct behavior?
{
"data": [
{
"id": "33",
"type": "time_off_request",
"attributes": {
"status": "approved",
"start_date": "2019-01-14",
"end_date": "2019-01-31"
},
"relationships": {
"user": {
"data": {
"id": "25",
"type": "user"
}
},
"policy": {
"data": {
"id": "24",
"type": "time_off_policy"
}
}
}
}
],
"included": [
{
"id": "25",
"type": "user",
"attributes": {
"id": 20550,
"name": "user name",
"email": "[email protected]",
"avatar": "",
"avatar_url": null
}
}
],
"meta": {
"total_pages": 1,
"total_count": 1
},
"links": {
"self": "url link"
}
}
Decoded as :
{
"links" : {
"self" : "url link"
},
"meta" : {
"total_pages" : 1,
"total_count" : 1
},
"data" : [
{
"status" : "approved",
"policy" : null,
"id" : "33",
"start_date" : "2019-01-14",
"type" : "time_off_request",
"end_date" : "2019-01-31",
"user" : {
"avatar" : "",
"id" : 20550,
"email" : "[email protected]",
"type" : "user",
"avatar_url" : null,
"name" : "user name"
}
}
]
}
I think the related relationship item (policy field with type time_off_policy
) not decoded as null, i.e :
{
"links" : {
"self" : "url link"
},
"meta" : {
"total_pages" : 1,
"total_count" : 1
},
"data" : [
{
"status" : "approved",
"policy" : {
"id": "24",
"type": "time_off_policy"
},
"id" : "33",
"start_date" : "2019-01-14",
"type" : "time_off_request",
"end_date" : "2019-01-31",
"user" : {
"avatar" : "",
"id" : 20550,
"email" : "[email protected]",
"type" : "user",
"avatar_url" : null,
"name" : "user name"
}
}
]
}
What do you think? Is it the correct implementation?
Or, is there a way to force the library to decode it as above?
Thanks
I am trying to deserialize a response like this:
{
"data": {
"id": "1",
"type": "schedule",
"attributes": {},
"relationships": {
"requests": {
"data": [{
"type": "pickup_request",
"id": "5"
}, {
"type": "swap_request",
"id": "25"
}]
}
},
"links": {
"self": "example.com/member/1/schedule"
}
},
"included": [{
"type": "pickup_request",
"id": "5",
"attributes": {
"attribute1": "",
"attribute2": "",
"status": "requested"
}
}, {
"type": "swap_request",
"id": "25",
"attributes": {
"attribute3": "",
"status": "requested",
}
}]
}
As you notice the included items have different types.
An error is thrown
While parsing, for example, the following structure:
struct Like: JapxCodable {
var id: String
var type: String = "likes"
}
struct Article: JapxCodable {
var id: String
var type: String = "articles"
var name: String
var likes: [Like]
}
Using
let notLikedArticle = Article(id: "1", name: "My Article", likes: [])
let params = try! JapxEncoder().encode(notLikedArticle)
I expected the relationships
key to have an empty likes
value:
["data": ["relationships": ["likes": ["data": [[]]]], "attributes": ["name": My Article], "id": 1, "type": articles]]
The likes
is encoded in the attributes
key instead:
["data": ["id": 1, "attributes": ["name": My Article, "likes": []], "relationships": [:], "type": articles]]
Article
and Like
described aboveI tried searching for options ou another way to configure that, but could not find any.
Updating the Japx to 3.0 requires me to change the minimum target of the project, and I cannot do that now.
Any help is welcome :)
Thanks!
Resources with relationships that are not included in the document should be decoded without losing the data that's specified in the relationship
The relationship key is set on the decoded dictionary, but the value is NSNull
The following code reproduces the issue:
let json =
"""
{
"data": {
"type": "articles",
"id": "1",
"attributes": {
"title": "Rails is Omakase"
},
"relationships": {
"author": {
"links": {
"self": "http://example.com/articles/1/relationships/author",
"related": "http://example.com/articles/1/author"
},
"data": {
"type": "people",
"id": "9"
}
}
},
"links": {
"self": "http://example.com/articles/1"
}
}
}
"""
let result = try? Japx.Decoder.jsonObject(with: json.data(using: .utf8)!) // (result!["data"] as! [String: Any])["author"] is NSNull
while encoding "include" data that should be added inside the request body.
But if I gave a dictionary to encode it "include" data not coming.
Give me suggestions for how I can add the "included" part in my request body.
Updating relationships should be done by including objects into a list which should be encoded into the top level object. Basically, we'd need support for all top level objects besides data.
{
"data": "...",
"meta":"...",
"included":"..."
}
What happens now is that all of the objects that are set in an included list end up being flattened into data.attributes
{
"data": {
"attributes": {
"included":"..."
}
}
}
An entity with an attribute named type
is legal json-api, and therefore Japx should be able to decode a resource with a field named type
Japx already requires an instance variable on entities named type
that is assigned to the entity-level type
, and the parser pulls all attributes up and therefore creates a conflict between type
on the entity level and a type
inside attributes
type
JapxKit.Decoder
type
attribute is overwritten by the entity-level type
Dependency "Japx" has no shared framework schemes for any of the platforms: iOS
Could be used for XCFramework
Can not be used for XCFramework, the reason is that a class/struct in the framework has the same name as the framework - "Japx".
Discussion on swift forum - https://forums.swift.org/t/frameworkname-is-not-a-member-type-of-frameworkname-errors-inside-swiftinterface/28962
This is a known issue and needs a workaround
'JapxDecodable' is not a member type of 'Japx'
Rename Japx
struct.
Easily import japx and japxCore without having to import Moya, Alamofire, etc.
SPM downloads the whole package and it's dependencies causing dependency resolution issues despite not wanting to use the other targets.
i.e. Want to use japx and japxcore but not japxrxalamofire but still imports all dependencies causing existing alamofire to have dependency resolution issues
.package(
url: "https://github.com/infinum/Japx",
.exact("4.0.0")
)
Adding dependency for infinum/Japx 4.0.0
should correctly resolve
Dependencies could not be resolved because package 'japx' is required using a stable-version but 'japx' depends on an unstable-version package 'moya' and root depends on 'Japx' 4.0.0.
Package.swift
dependencies:.package(
url: "https://github.com/infinum/Japx",
.exact("4.0.0")
)
4.0.0
iOS
It might be due to my limited knowledge of this library, but I can't seem to find a way to encode object with meta
field.
If I add meta property to object, it is encoded as attribute (i would say expectedly).
I can workaround this by manually inserting meta dictionary to encoded version of the object. But this is not very elegant.
I am using Codable extension.
Builds to succeed
Builds fail
github "infinum/Japx" ~> 4.0
❯ carthage bootstrap --platform iOS --use-xcframeworks
*** Checking out Japx at "4.0.1"
*** Checking out Alamofire at "5.5.0"
*** Checking out RxSwift at "6.5.0"
*** xcodebuild output can be found in /var/folders/wv/3x3z8j4567b5b2z10mnly2jm0000gn/T/carthage-xcodebuild.vCVhBj.log
*** Downloading RxSwift binary at "Atlas"
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace
A shell task (/usr/bin/xcrun xcodebuild -project /MY_PROJECT/Carthage/Checkouts/Japx/Examples/SwiftPM/JapxExample/JapxExample.xcodeproj CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES -list) failed with exit code 74:
objc[77024]: Class AMSupportURLConnectionDelegate is implemented in both /usr/lib/libauthinstall.dylib (0x20515ab90) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x1040ec2c8). One of the two will be used. Which one is undefined.
objc[77024]: Class AMSupportURLSession is implemented in both /usr/lib/libauthinstall.dylib (0x20515abe0) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x1040ec318). One of the two will be used. Which one is undefined.
xcodebuild: error: Unable to read project 'JapxExample.xcodeproj' from folder '/MY_PROJECT/Carthage/Checkouts/Japx/Examples/SwiftPM/JapxExample'.
Reason: Project /MY_PROJECT/Carthage/Checkouts/Japx/Examples/SwiftPM/JapxExample/JapxExample.xcodeproj cannot be opened because it is missing its project.pbxproj file.
Moya/RxSwift has updated to version 12.0.1
Currently Moya flavoured pods are pointing to version 11.0
Is it possible to consider updating to v12.0.1 for Moya dependencies at this point?
deleted
Hi guys, is there any way that in the future there will be support for carthage?
Thanks!
Hello, I try parse this response
{
"data": [
{
"type": "messages",
"id": "1",
"attributes": {
"text": "qqq",
"create_date": "2017-06-09T09:35:34.428523"
},
"meta": {
"unread": true
}
}
]
}
this model not work
struct JapxResponse<T: Codable>: Codable {
let data: T
}
struct MessageModel: JapxCodable, Equatable, Hashable {
let type: String
let id: String
let text: String
let createDate: String
let unread: Bool
enum CodingKeys: String, CodingKey {
case type, id, text, createDate = "create_date", unread
}
}
help pls, ty
I need an example code of a CRUD using Codable and Alamofire. Because the support documentation has simples examples and I would like to know the best practices for this implementation.
Edit: realised I could just use JapxEncodable
From the JSONAPI specification website:
> Exception: The id member is not required when the resource object originates at the client and represents a new resource to be created on the server.
However, it is not possible to create a JapxCodable
without an id
.
Did you rename Jade?
I searched jade for a long time, but didn't find it. 🤣
There should be a documentation about encoding nested included objects.
Currently, nor on example project neither documentation, there is no info about this topic.
It is crashing on decoding the following json object:
But is working with other json
{
"jsonapi": {
"version": "1.0",
"meta": {
"links": {
"self": {
"href": "http://jsonapi.org/format/1.0/"
}
}
}
},
"data": [
{
"type": "commerce_product--estacao_de_servico",
"id": "42f98d4f-0200-437a-84c9-f9793581460d",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d"
}
},
"attributes": {
"drupal_internal__product_id": 2,
"langcode": "pt-pt",
"status": true,
"title": "Pen USB Repsol",
"path": {
"alias": "/produto/pen-usb-repsol",
"pid": 11,
"langcode": "pt-pt"
},
"created": "2019-08-28T14:59:31+00:00",
"changed": "2019-12-17T15:32:54+00:00",
"default_langcode": true,
"metatag": null,
"body": {
"value": "<p>Pen USB Repsol.</p>\r\n",
"format": "basic_html",
"processed": "<p>Pen USB Repsol.</p>",
"summary": ""
},
"field_delivery": "Imediata nas Estações de Serviço.",
"field_meta_tags": null
},
"relationships": {
"commerce_product_type": {
"data": {
"type": "commerce_product_type--commerce_product_type",
"id": "d6efc374-e781-4388-bf3a-7cfce202ad25"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/commerce_product_type"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/relationships/commerce_product_type"
}
}
},
"stores": {
"data": [
{
"type": "commerce_store--online",
"id": "a8471acd-f641-4550-872f-11f5aa5e19ed"
}
],
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/stores"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/relationships/stores"
}
}
},
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/relationships/uid"
}
}
},
"variations": {
"data": [
{
"type": "commerce_product_variation--estacao_de_servico",
"id": "b1411858-68f1-4486-92cc-002df49bb235"
}
],
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/variations"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/relationships/variations"
}
}
},
"field_brand": {
"data": {
"type": "taxonomy_term--marca",
"id": "8ea56e8d-73fd-4fb0-8d67-ac029938b54b"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/field_brand"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/relationships/field_brand"
}
}
},
"field_category": {
"data": {
"type": "taxonomy_term--categories_store",
"id": "d628ccad-39fc-4135-9e34-3a9b197a2377"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/field_category"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/relationships/field_category"
}
}
},
"field_supplier": {
"data": {
"type": "taxonomy_term--seller",
"id": "35884fe2-ca79-43a3-afbe-3def2149ae4d"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/field_supplier"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico/42f98d4f-0200-437a-84c9-f9793581460d/relationships/field_supplier"
}
}
}
}
}
],
"included": [
{
"type": "taxonomy_term--marca",
"id": "8ea56e8d-73fd-4fb0-8d67-ac029938b54b",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/marca/8ea56e8d-73fd-4fb0-8d67-ac029938b54b"
}
},
"attributes": {
"drupal_internal__tid": 315,
"drupal_internal__revision_id": 315,
"langcode": "pt-pt",
"revision_created": "2019-12-17T11:49:03+00:00",
"revision_log_message": null,
"status": true,
"name": "Audioquest",
"description": null,
"weight": 0,
"changed": "2019-12-17T11:49:03+00:00",
"default_langcode": true,
"revision_translation_affected": true,
"metatag": null,
"path": {
"alias": null,
"pid": null,
"langcode": "pt-pt"
},
"rh_action": null,
"rh_redirect": null,
"rh_redirect_response": null,
"depth_level": 1
},
"relationships": {
"vid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/marca/8ea56e8d-73fd-4fb0-8d67-ac029938b54b/relationships/vid"
}
}
},
"revision_user": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/marca/8ea56e8d-73fd-4fb0-8d67-ac029938b54b/relationships/revision_user"
}
}
},
"parent": {
"data": [
{
"type": "taxonomy_term--marca",
"id": "virtual",
"meta": {
"links": {
"help": {
"href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual",
"meta": {
"about": "Usage and meaning of the 'virtual' resource identifier."
}
}
}
}
}
],
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/marca/8ea56e8d-73fd-4fb0-8d67-ac029938b54b/parent"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/marca/8ea56e8d-73fd-4fb0-8d67-ac029938b54b/relationships/parent"
}
}
},
"field_image": {
"data": null,
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/marca/8ea56e8d-73fd-4fb0-8d67-ac029938b54b/field_image"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/marca/8ea56e8d-73fd-4fb0-8d67-ac029938b54b/relationships/field_image"
}
}
}
}
},
{
"type": "taxonomy_term--categories_store",
"id": "d628ccad-39fc-4135-9e34-3a9b197a2377",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/categories_store/d628ccad-39fc-4135-9e34-3a9b197a2377"
}
},
"attributes": {
"drupal_internal__tid": 91,
"drupal_internal__revision_id": 91,
"langcode": "pt-pt",
"revision_created": "2019-11-18T15:23:41+00:00",
"revision_log_message": null,
"status": true,
"name": "Vales",
"description": null,
"weight": 1,
"changed": "2019-11-19T12:41:37+00:00",
"default_langcode": true,
"revision_translation_affected": true,
"metatag": null,
"path": {
"alias": null,
"pid": null,
"langcode": "pt-pt"
},
"rh_action": "bundle_default",
"rh_redirect": null,
"rh_redirect_response": 301,
"depth_level": 2,
"field_rate": null
},
"relationships": {
"vid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/categories_store/d628ccad-39fc-4135-9e34-3a9b197a2377/relationships/vid"
}
}
},
"revision_user": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/categories_store/d628ccad-39fc-4135-9e34-3a9b197a2377/relationships/revision_user"
}
}
},
"parent": {
"data": [
{
"type": "taxonomy_term--categories_store",
"id": "2711f91c-9289-4b37-9fbb-c826804e3720"
}
],
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/categories_store/d628ccad-39fc-4135-9e34-3a9b197a2377/parent"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/categories_store/d628ccad-39fc-4135-9e34-3a9b197a2377/relationships/parent"
}
}
},
"field_icon": {
"data": {
"type": "file--file",
"id": "168ca355-1ff6-4c29-9969-b27e756e7c2e",
"meta": {
"alt": "Ofertas nas estações de serviço",
"title": "",
"width": 24,
"height": 24
}
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/categories_store/d628ccad-39fc-4135-9e34-3a9b197a2377/field_icon"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/categories_store/d628ccad-39fc-4135-9e34-3a9b197a2377/relationships/field_icon"
}
}
}
}
},
{
"type": "taxonomy_term--seller",
"id": "35884fe2-ca79-43a3-afbe-3def2149ae4d",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/seller/35884fe2-ca79-43a3-afbe-3def2149ae4d"
}
},
"attributes": {
"drupal_internal__tid": 17,
"drupal_internal__revision_id": 17,
"langcode": "pt-pt",
"revision_created": "2019-09-20T15:36:38+00:00",
"revision_log_message": null,
"status": true,
"name": "El corte",
"description": null,
"weight": 0,
"changed": "2019-12-06T12:03:05+00:00",
"default_langcode": true,
"revision_translation_affected": true,
"metatag": null,
"path": {
"alias": null,
"pid": null,
"langcode": "pt-pt"
},
"rh_action": "bundle_default",
"rh_redirect": null,
"rh_redirect_response": 301,
"depth_level": 1
},
"relationships": {
"vid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/seller/35884fe2-ca79-43a3-afbe-3def2149ae4d/relationships/vid"
}
}
},
"revision_user": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/seller/35884fe2-ca79-43a3-afbe-3def2149ae4d/relationships/revision_user"
}
}
},
"parent": {
"data": [
{
"type": "taxonomy_term--seller",
"id": "virtual",
"meta": {
"links": {
"help": {
"href": "https://www.drupal.org/docs/8/modules/json-api/core-concepts#virtual",
"meta": {
"about": "Usage and meaning of the 'virtual' resource identifier."
}
}
}
}
}
],
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/seller/35884fe2-ca79-43a3-afbe-3def2149ae4d/parent"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/seller/35884fe2-ca79-43a3-afbe-3def2149ae4d/relationships/parent"
}
}
},
"field_image": {
"data": {
"type": "media--image",
"id": "9520e95e-b2ed-4c60-80a9-fc20ec9534de"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/seller/35884fe2-ca79-43a3-afbe-3def2149ae4d/field_image"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/taxonomy_term/seller/35884fe2-ca79-43a3-afbe-3def2149ae4d/relationships/field_image"
}
}
}
}
},
{
"type": "commerce_product_variation--estacao_de_servico",
"id": "b1411858-68f1-4486-92cc-002df49bb235",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235"
}
},
"attributes": {
"drupal_internal__variation_id": 2,
"langcode": "pt-pt",
"status": true,
"sku": "USB Repsol",
"title": "USB Repsol",
"list_price": null,
"price": {
"number": "0.000000",
"currency_code": "PTS",
"formatted": "0 pts"
},
"created": "2019-08-28T15:00:23+00:00",
"changed": "2019-12-17T15:32:54+00:00",
"default_langcode": true
},
"relationships": {
"commerce_product_variation_type": {
"data": {
"type": "commerce_product_variation_type--commerce_product_variation_type",
"id": "01f90d75-47d8-407b-b481-7b545210a33f"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235/commerce_product_variation_type"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235/relationships/commerce_product_variation_type"
}
}
},
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235/relationships/uid"
}
}
},
"product_id": {
"data": {
"type": "commerce_product--estacao_de_servico",
"id": "42f98d4f-0200-437a-84c9-f9793581460d"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235/product_id"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235/relationships/product_id"
}
}
},
"field_image": {
"data": [
{
"type": "media--image",
"id": "da8e3690-7cb9-41c4-9728-8f55a7494119"
},
{
"type": "media--image",
"id": "d1f060ce-4115-44de-a19e-d3377e3c80e2"
},
{
"type": "media--image",
"id": "8c12bb71-8f23-485e-ba2d-6ef40098d802"
}
],
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235/field_image"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product_variation/estacao_de_servico/b1411858-68f1-4486-92cc-002df49bb235/relationships/field_image"
}
}
}
}
},
{
"type": "media--image",
"id": "da8e3690-7cb9-41c4-9728-8f55a7494119",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119?resourceVersion=id%3A1"
}
},
"attributes": {
"drupal_internal__mid": 1,
"drupal_internal__vid": 1,
"langcode": "pt-pt",
"revision_created": "2019-08-28T11:29:17+00:00",
"revision_log_message": null,
"status": true,
"name": "placeholder_300x150.png",
"created": "2019-08-28T11:29:00+00:00",
"changed": "2019-08-28T14:27:40+00:00",
"default_langcode": true,
"revision_translation_affected": true,
"metatag": null,
"path": {
"alias": null,
"pid": null,
"langcode": "pt-pt"
}
},
"relationships": {
"bundle": {
"data": {
"type": "media_type--media_type",
"id": "7a1e1189-19d2-4e5d-a94a-7c6f1aa24a10"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/bundle?resourceVersion=id%3A1"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/relationships/bundle?resourceVersion=id%3A1"
}
}
},
"revision_user": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/relationships/revision_user?resourceVersion=id%3A1"
}
}
},
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/relationships/uid?resourceVersion=id%3A1"
}
}
},
"thumbnail": {
"data": {
"type": "file--file",
"id": "c46a63ea-8183-48c0-8678-6422be7ac8c2",
"meta": {
"alt": "placeholder",
"title": null,
"width": 200,
"height": 200
}
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/thumbnail?resourceVersion=id%3A1"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/relationships/thumbnail?resourceVersion=id%3A1"
}
}
},
"field_media_image": {
"data": {
"type": "file--file",
"id": "c46a63ea-8183-48c0-8678-6422be7ac8c2",
"meta": {
"alt": "placeholder",
"title": "",
"width": 300,
"height": 150
}
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/field_media_image?resourceVersion=id%3A1"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/da8e3690-7cb9-41c4-9728-8f55a7494119/relationships/field_media_image?resourceVersion=id%3A1"
}
}
}
}
},
{
"type": "media--image",
"id": "d1f060ce-4115-44de-a19e-d3377e3c80e2",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2?resourceVersion=id%3A2"
}
},
"attributes": {
"drupal_internal__mid": 2,
"drupal_internal__vid": 2,
"langcode": "pt-pt",
"revision_created": "2019-08-28T14:32:26+00:00",
"revision_log_message": null,
"status": true,
"name": "placeholder_200x200_1.png",
"created": "2019-08-28T14:32:14+00:00",
"changed": "2019-08-28T14:32:26+00:00",
"default_langcode": true,
"revision_translation_affected": true,
"metatag": null,
"path": {
"alias": null,
"pid": null,
"langcode": "pt-pt"
}
},
"relationships": {
"bundle": {
"data": {
"type": "media_type--media_type",
"id": "7a1e1189-19d2-4e5d-a94a-7c6f1aa24a10"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/bundle?resourceVersion=id%3A2"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/relationships/bundle?resourceVersion=id%3A2"
}
}
},
"revision_user": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/relationships/revision_user?resourceVersion=id%3A2"
}
}
},
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/relationships/uid?resourceVersion=id%3A2"
}
}
},
"thumbnail": {
"data": {
"type": "file--file",
"id": "a3528811-ec99-4404-9aa3-66d21cd8c902",
"meta": {
"alt": "placeholder",
"title": null,
"width": 200,
"height": 200
}
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/thumbnail?resourceVersion=id%3A2"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/relationships/thumbnail?resourceVersion=id%3A2"
}
}
},
"field_media_image": {
"data": {
"type": "file--file",
"id": "a3528811-ec99-4404-9aa3-66d21cd8c902",
"meta": {
"alt": "placeholder",
"title": "",
"width": 200,
"height": 200
}
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/field_media_image?resourceVersion=id%3A2"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/d1f060ce-4115-44de-a19e-d3377e3c80e2/relationships/field_media_image?resourceVersion=id%3A2"
}
}
}
}
},
{
"type": "media--image",
"id": "8c12bb71-8f23-485e-ba2d-6ef40098d802",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802?resourceVersion=id%3A3"
}
},
"attributes": {
"drupal_internal__mid": 3,
"drupal_internal__vid": 3,
"langcode": "pt-pt",
"revision_created": "2019-08-28T14:34:09+00:00",
"revision_log_message": null,
"status": true,
"name": "placeholder_200x200_2.png",
"created": "2019-08-28T14:33:49+00:00",
"changed": "2019-08-28T14:34:09+00:00",
"default_langcode": true,
"revision_translation_affected": true,
"metatag": null,
"path": {
"alias": null,
"pid": null,
"langcode": "pt-pt"
}
},
"relationships": {
"bundle": {
"data": {
"type": "media_type--media_type",
"id": "7a1e1189-19d2-4e5d-a94a-7c6f1aa24a10"
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/bundle?resourceVersion=id%3A3"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/relationships/bundle?resourceVersion=id%3A3"
}
}
},
"revision_user": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/relationships/revision_user?resourceVersion=id%3A3"
}
}
},
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/relationships/uid?resourceVersion=id%3A3"
}
}
},
"thumbnail": {
"data": {
"type": "file--file",
"id": "d5301e43-40d9-49ee-849a-6f82901ac311",
"meta": {
"alt": "placeholder",
"title": null,
"width": 200,
"height": 200
}
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/thumbnail?resourceVersion=id%3A3"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/relationships/thumbnail?resourceVersion=id%3A3"
}
}
},
"field_media_image": {
"data": {
"type": "file--file",
"id": "d5301e43-40d9-49ee-849a-6f82901ac311",
"meta": {
"alt": "placeholder",
"title": "",
"width": 200,
"height": 200
}
},
"links": {
"related": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/field_media_image?resourceVersion=id%3A3"
},
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/media/image/8c12bb71-8f23-485e-ba2d-6ef40098d802/relationships/field_media_image?resourceVersion=id%3A3"
}
}
}
}
},
{
"type": "file--file",
"id": "c46a63ea-8183-48c0-8678-6422be7ac8c2",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/file/file/c46a63ea-8183-48c0-8678-6422be7ac8c2"
}
},
"attributes": {
"drupal_internal__fid": 2,
"langcode": "pt-pt",
"filename": "placeholder_300x150.png",
"uri": {
"value": "public://2019-08/placeholder_300x150.png",
"url": "/sites/default/files/2019-08/placeholder_300x150.png"
},
"filemime": "image/png",
"filesize": 1095,
"status": true,
"created": "2019-08-28T14:27:37+00:00",
"changed": "2019-08-28T14:27:40+00:00"
},
"relationships": {
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/file/file/c46a63ea-8183-48c0-8678-6422be7ac8c2/relationships/uid"
}
}
}
}
},
{
"type": "file--file",
"id": "a3528811-ec99-4404-9aa3-66d21cd8c902",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/file/file/a3528811-ec99-4404-9aa3-66d21cd8c902"
}
},
"attributes": {
"drupal_internal__fid": 3,
"langcode": "pt-pt",
"filename": "placeholder_200x200_1.png",
"uri": {
"value": "public://2019-08/placeholder_200x200_1.png",
"url": "/sites/default/files/2019-08/placeholder_200x200_1.png"
},
"filemime": "image/png",
"filesize": 781,
"status": true,
"created": "2019-08-28T14:32:18+00:00",
"changed": "2019-08-28T14:32:26+00:00"
},
"relationships": {
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/file/file/a3528811-ec99-4404-9aa3-66d21cd8c902/relationships/uid"
}
}
}
}
},
{
"type": "file--file",
"id": "d5301e43-40d9-49ee-849a-6f82901ac311",
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/file/file/d5301e43-40d9-49ee-849a-6f82901ac311"
}
},
"attributes": {
"drupal_internal__fid": 4,
"langcode": "pt-pt",
"filename": "placeholder_200x200_2.png",
"uri": {
"value": "public://2019-08/placeholder_200x200_2.png",
"url": "/sites/default/files/2019-08/placeholder_200x200_2.png"
},
"filemime": "image/png",
"filesize": 781,
"status": true,
"created": "2019-08-28T14:34:03+00:00",
"changed": "2019-08-28T14:34:09+00:00"
},
"relationships": {
"uid": {
"data": null,
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/file/file/d5301e43-40d9-49ee-849a-6f82901ac311/relationships/uid"
}
}
}
}
}
],
"links": {
"self": {
"href": "https://repsolmove.dev.server.diamondbybold.com/jsonapi/commerce_product/estacao_de_servico?fields%5Bvariations%5D%5Bfield_image%5D=field_media_image&fields%5Bvariations%5D%5Bfield_media_image%5D=uri%2Curl&filter%5Bcategories_store%5D%5Bcondition%5D%5Boperator%5D=%3D&filter%5Bcategories_store%5D%5Bcondition%5D%5Bpath%5D=field_category.tid&filter%5Bcategories_store%5D%5Bcondition%5D%5Bvalue%5D=91&include=field_brand%2Cfield_category%2Cfield_supplier%2Cvariations%2Cvariations.field_image%2Cvariations.field_image.field_media_image%2Cvariations.field_image.field_media_image"
}
}
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.