Это дает желаемый результат (и, возможно, может быть подвергнут рефакторингу в дальнейшем).
Основная идея заключается в том, чтобы установить для JSON то, к чему он может затем «присоединиться». См. Результаты каждой смены и краткое объяснение ниже.
Полная скорость c
[
{
//shift 1
"operation": "shift",
"spec": {
"*": "&",
"relationships": {
"*": {
"type": {
"*": {
"@(2,attributes)": "@2.@(3,id)"
}
}
}
}
}
},
{
//shift 2
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"author": {
"*": {
"@(2)": "data.@2.data.[]"
}
}
}
}
}
},
{
//shift 3
"operation": "shift",
"spec": {
"*": "&",
"author": {
"*": {
"@": "data.&.author"
}
}
}
},
{
//shift 4
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"data": {
"*": {
"@(id)": "data.@(id).id",
"@(title)": "data.@(id).title",
"@(2,author)": "data.@(id).author",
"@(publisher)": "data.@(id).publisher",
"@(edition)": "data.@(id).edition",
"@(published)": "data.@(id).published"
}
}
}
}
}
},
{
//shift 5
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"publisher": {
"*": {
"@(2)": "data.@2.data.[]"
}
}
}
}
}
},
{
//shift 6
"operation": "shift",
"spec": {
"*": "&",
"publisher": {
"*": {
"@": "data.&.publisher"
}
}
}
},
{
//shift 7
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"data": {
"*": {
"@(id)": "data.@(id).id",
"@(title)": "data.@(id).title",
"@(author)": "data.@(id).author",
"@(2,publisher)": "data.@(id).publisher",
"@(edition)": "data.@(id).edition",
"@(published)": "data.@(id).published"
}
}
}
}
}
},
{
//shift 8
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"@": "data.[]"
}
}
}
}
]
Смена 1
Отношения, обозначенные соответствующими идентификаторами:
{
"operation": "shift",
"spec": {
"*": "&",
"relationships": {
"*": {
"type": {
"*": {
"@(2,attributes)": "@2.@(3,id)"
}
}
}
}
}
}
// ...
"author" : {
"54256" : {
"first-name" : "Lindsay",
"last-name" : "Bassett",
"city" : "Michigan"
},
"15467" : {
"first-name" : "Tom",
"last-name" : "Marrs",
"city" : "Cologne"
}
},
"publisher" : {
"57756" : {
"name" : "O'REILLY",
"established" : "1984"
},
"56465" : {
"name" : "APRESS",
"established" : "1979"
}
}
}
Сдвиг 2 и 5
Данные, введенные соответствующим автором (2) или издателем (5) Идентификаторы:
{
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"author": {
//"publisher": {
"*": {
"@(2)": "data.@2.data.[]"
}
}
}
}
}
}
"data" : {
"54256" : {
"data" : [ {
"id" : "1112245810",
"title" : "Introduction to JavaScript Object Notation",
"author" : "54256",
"publisher" : "57756",
"edition" : "first",
"published" : "2012"
}, {
"id" : "1004467968",
"title" : "A Tiny Bit Mortal",
"author" : "54256",
"publisher" : "56465",
"edition" : "first",
"published" : "2018"
} ]
},
"15467" : {
"data" : [ {
"id" : "1156464683",
"title" : "JSON at Work",
"author" : "15467",
"publisher" : "57756",
"edition" : "second",
"published" : "2014"
} ]
}
},
Сдвиг 3 и 6
Теперь переместите автора (3) или издателя (6) рядом с данными:
{
"operation": "shift",
"spec": {
"*": "&",
"author": {
//"publisher": {
"*": {
"@": "data.&.author"
//"@": "data.&.publisher"
}
}
}
},
"54256" : {
"data" : [ {
"id" : "1112245810",
"title" : "Introduction to JavaScript Object Notation",
"author" : "54256",
"publisher" : "57756",
"edition" : "first",
"published" : "2012"
}, {
"id" : "1004467968",
"title" : "A Tiny Bit Mortal",
"author" : "54256",
"publisher" : "56465",
"edition" : "first",
"published" : "2018"
} ],
"author" : {
"first-name" : "Lindsay",
"last-name" : "Bassett",
"city" : "Michigan"
}
},
"15467" : {
Spe c 4 и 7
Копирование авторов (4) или издателя (7) в каждый элемент данных и ключ по идентификатору данных:
{
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"data": {
"*": {
"@(id)": "data.@(id).id",
"@(title)": "data.@(id).title",
"@(2,author)": "data.@(id).author",
//"@(author)": "data.@(id).author",
"@(publisher)": "data.@(id).publisher",
//"@(2,publisher)": "data.@(id).publisher",
"@(edition)": "data.@(id).edition",
"@(published)": "data.@(id).published"
}
}
}
}
}
},
"data" : {
"1112245810" : {
"id" : "1112245810",
"title" : "Introduction to JavaScript Object Notation",
"author" : {
"first-name" : "Lindsay",
"last-name" : "Bassett",
"city" : "Michigan"
},
"publisher" : "57756",
"edition" : "first",
"published" : "2012"
},
"1004467968" : {
"id" : "1004467968",
"title" : "A Tiny Bit Mortal",
"author" : {
"first-name" : "Lindsay",
"last-name" : "Bassett",
"city" : "Michigan"
},
"publisher" : "56465",
"edition" : "first",
"published" : "2018"
},
Spe c 8
Удалить идентификатор данных в качестве ключа:
{
"operation": "shift",
"spec": {
"*": "&",
"data": {
"*": {
"@": "data.[]"
}
}
}
}
"data" : [ {
"id" : "1112245810",
"title" : "Introduction to JavaScript Object Notation",
"author" : {
"first-name" : "Lindsay",
"last-name" : "Bassett",
"city" : "Michigan"
},
"publisher" : {
"name" : "O'REILLY",
"established" : "1984"
},
"edition" : "first",
"published" : "2012"
}, {
"id" : "1156464683",