Объединение двух файлов JSON, экспортированных из wordpress

у меня есть два файла Json, которые я экспортировал из wordpress, которые имеют соответствующие идентификаторы, я хочу объединить их в один файл Json, чтобы я мог принести его на веб-сайт, который я создаю с помощью Gatsby JS. Одним из файлов является posts.json и другое postsMeta.json. В post_id в postsMeta соответствует ID в посты

как бы я идти об объединении двух? Могу ли я запустить какой-то for цикл в JS и как бы я так? Я на windows есть ли JSON explorer, который может помочь мне в этом.

Я хотел бы также, чтобы урезать некоторые из unnecasry, например, такие как 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, Если вы хотите скопировать результат в буфер обмена, а не войти в консоль