Объединение двух файлов JSON, экспортированных из wordpress
у меня есть два файла Json, которые я экспортировал из wordpress, которые имеют соответствующие идентификаторы, я хочу объединить их в один файл Json, чтобы я мог принести его на веб-сайт, который я создаю с помощью Gatsby JS. Одним из файлов является posts.json
и другое postsMeta.json
. В post_id в postsMeta соответствует ID в посты
как бы я идти об объединении двух? Могу ли я запустить какой-то for
цикл в JS и как бы я так? Я на windows есть ли JSON explorer, который может помочь мне в этом.
post_parent
на посты JSON и что-то вроде meta_key
на postsMeta в формате JSON.
хорошо, надеюсь, это достаточно ясно, спасибо заранее.
вот пример первых объектов, соответствующих парам в двух файлы
сообщения.в JSON
{"ID":"19","post_author":"2","post_date":"2010-12-31 23:02:04","post_date_gmt":"2010-12-31 23:02:04","post_content":"Harry Potter was not available for the first sitting of the Halloween Picture. I hope everyone had a safe and fun Halloween. Tomorrow is picture retake day, please send back your previous prints if you want retakes. It is also hot lunch. See You tomorrow!","post_title":"Happy Halloween","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"open","post_password":"","post_name":"happy-halloween","to_ping":"","pinged":"","post_modified":"2011-01-03 05:26:11","post_modified_gmt":"2011-01-03 05:26:11","post_content_filtered":"","post_parent":"0","guid":"http://localhost/mrskitson.ca_wordpress/?p=19","menu_order":"0","post_type":"post","post_mime_type":"","comment_count":"1"},
postsMeta.в JSON
{"meta_id":"27","post_id":"19","meta_key":"large_preview","meta_value":"http://www.mrskitson.ca/wp-content/uploads/2010/12/halloween.jpg"},
обновление:
этой является попыткой решить эту проблему с текущим ответом, вы можете редактировать код там.
4 ответов
тупой к месту для вашего вопроса. Мы хотим:
- слияние
var a = {/*some json*/}
наvar b = {/*another json*/}
- обрезать поля в
var exclusions = ["post_parent","meta_key"]
объединить JSONS
во-первых, нам нужно заполнить a и b. Ваши JSONs разбираются на объекты Javascript с помощью в формате JSON.parse ():
let a = JSON.parse(/*JSON here*/);
let b = JSON.parse(/*JSON here*/);
потому что, как свойства определяются в Javascript, если вы снова определяете свойство, второе определение перепишу первую. Ваши JSONS содержат только строки как ключи и строки как значения, поэтому мелкая копия хватит.
как мне лучше всего пойти о слиянии двух?
это обязательное для вас объединить два JSON файлов / данных?
потому что вы можете просто потребовать или загрузить данные JSON из своего скрипта (или даже поместить их в HTML
), а затем, чтобы получить мета-значение определенного мета-поля / ключа, это function
мог бы это сделать:
// `single` has no effect if `meta_key` is empty.
function getPostMeta( post_id, meta_key, single ) {
let id = String( post_id ),
pm = [];
postsMeta.map( m => {
let a = ( ! meta_key ) ||
( meta_key === m.meta_key );
if ( a && id === m.post_id ) {
pm.push( m );
}
});
let meta = {},
mk = {};
pm.map( m => {
let k = m.meta_key, v;
if ( undefined === meta[ k ] ) {
meta[ k ] = m.meta_value;
} else {
v = meta[ k ];
if ( undefined === mk[ k ] ) {
meta[ k ] = [ v ];
mk[ k ] = 1;
}
meta[ k ].push( m.meta_value );
m[ k ]++;
}
});
pm = null;
mk = meta_key ? mk[ meta_key ] : null;
if ( mk ) {
return single ?
meta[ meta_key ][0] : // Returns a single meta value.
meta[ meta_key ]; // Returns all the meta values.
}
return meta_key ?
meta[ meta_key ] : // Returns the value of the `meta_key`.
meta; // Or returns all the post's meta data.
}
данные, которые я использовал для тестирования: (обратите внимание на postsMeta
in вышесказанное/
Если вы можете сделать это в JS, есть довольно простой подход, используя Array#map
. Если вы упрощаете свой вопрос, вы действительно спрашиваете, как добавить эти метаданные под каждую запись в сообщениях и получить только нужные поля.
Я принимаю посты.json на самом деле является массивом (например,[{"ID":"19"....
).
// Load these server-side, fetch them remotely, copy-paste, etc.
// I'll require them here for simplicity
const posts = require('./posts.json');
const postsMeta = require('./postsMeta.json');
// Build a Map so we can quickly look up the metas by post_id
// Extract what we need by destructuring the args
const metaByPost = postsMeta.reduce((a, {
post_id: id,
meta_value: value,
}) => a.set(id, {
value,
/* anything else you want in here */,
}), new Map());
const mergedPosts = posts.map(post => ({
// Spread in the post
...post,
// Spread in the meta content
...metaByPost.get(post.ID),
// Undefine the props we don't want
post_parent: undefined,
}));
Я не любовь ручная настройка материала на неопределенный - я думаю, что лучше явно сказать, какие реквизиты вы собираетесь включить, вместо загрузки все и безукоризненный реквизит.
попробуйте этот фрагмент непосредственно в консоли Chrome DevTools:
(function(
postsUrl='https://cdn.glitch.com/61300ea6-6cc4-4cb6-a62f-31adc62ea5cc%2Fposts.json?1525386749382',
metaUrl='https://cdn.glitch.com/61300ea6-6cc4-4cb6-a62f-31adc62ea5cc%2Fpostmeta.json?1525386742630'
) {
Promise.all([
fetch(postsUrl).then(r => r.json()),
fetch(metaUrl).then(r => r.json()),
]).then(([postsResponse, metaResponse]) => {
// Inspected the actual JSON response to come up with the data structure
const posts = postsResponse[2].data;
const meta = metaResponse[2].data;
const metaByPostId = meta.reduce((accum, el) => {
accum[el.post_id] = el;
return accum;
}, {});
const transformedPosts = posts.map(post => {
const merged = {
...post,
...(metaByPostId[post.ID] || {}),
};
delete merged.post_parent;
// delete any other fields not wanted in the result
return merged;
});
console.log(transformedPosts);
});
})();
- заменить URL-адреса соответственно, я использовал те из примера Глюка здесь
- как прокомментировано, фактические данные похоронены в
response[2].data
. Используйте вкладку Network / Parsed view для просмотра структуры - заменить
console.log
Сcopy
, Если вы хотите скопировать результат в буфер обмена, а не войти в консоль