2017-07-12 1 views
0

J'ai beaucoup de mal à faire en sorte que cette chaîne soit analysable. Cela peut sembler une tâche simple, mais ça me rend fou. Infusionsoft renvoie cela comme leur charge utile de repos, donc je ne peux pas changer la façon dont il est reçu.Comment analyser un tableau de chaînes en JSON?

JSON.parse() ne fonctionne pas et je ne peux pas l'utiliser comme littéral d'objet car l'horodatage n'a pas de guillemets. Existe-t-il une méthode ou un moyen que je n'ai pas réussi à voir pour analyser ceci afin que je puisse facilement obtenir chaque id avec une boucle for à titre d'exemple?

[{id:1049105, api_url:'', timestamp: 2017-07-12T00:34:36.000Z},{id:993221, api_url:'', timestamp: 2017-07-12T00:34:18.000Z}]

Toute aide serait grandement apprécié.

+1

Ce JSON n'est pas du tout valide, les propriétés doivent toutes être entourées de guillemets pour être valides. – wilsonhobbs

+0

Essayez-vous d'analyser le tout? Pourriez-vous être un peu plus clair? –

+1

J'ai l'impression que vous obtenez un JSON valide de l'API, mais qu'il est déjà analysé. Par exemple, si vous utilisez 'jQuery.ajax' avec le type de données' json' spécifié pour envoyer la requête au serveur. Dans ce cas, vous avez peut-être collé la sortie du journal de votre objet analysé dans votre question. Si cela arrive, alors vous n'avez pas du tout besoin de 'JSON.parse()'. Si ce n'est pas le cas, je suggère de coller un échantillon de code pour qu'il soit plus facile de voir ce que vous faites. – Marconius

Répondre

0

Avec certaines manipulations de chaînes et l'itération sur les parties de chaîne, nous pouvons analyser cette réponse dans un tableau d'objets JS valides.

J'ai exécuté le code ci-dessous et je récupère un tableau d'objets JS qui correspondent à chaque "objet" dans la chaîne de tableau. Il convertira également la valeur d'horodatage invalide en un objet date JS.

let args = "[{id:1049105, api_url:'', timestamp: 2017-07-12T00:34:36.000Z},{id:993221, api_url:'', timestamp: 2017-07-12T00:34:18.000Z}]" 

let splitArgs = args.split('},') 
// Create an Array of parsed Objects 
let objs = splitArgs.map(arg => { 
    // remove whitespace 
    let cleanArg = arg.trim() 

    // Remove enclosing [ { } ] characters 
    if (arg.startsWith('[')) { 
     cleanArg = cleanArg.substr(1, arg.length) 
    } 
    if (cleanArg.startsWith('{')) { 
     cleanArg = cleanArg.substr(1, arg.length) 
    } 
    if (cleanArg.endsWith(']')) { 
     cleanArg = cleanArg.substr(0, arg.length - 1) 
    } 
    if (cleanArg.endsWith('}')) { 
     cleanArg = cleanArg.substr(0, arg.length - 1) 
    } 

    // Remove any quotations and then split each of the properties out 
    let props = cleanArg.replace(/[\']+/, '').split(',') 

    // For each prop, get the value and assign it to the new object 
    // that will be returned by reduce() 
    return props.reduce((obj, prop) => { 
     let splitIndex = prop.indexOf(':') 
     let key = prop.substr(0, splitIndex) 
     let val = prop.substr(splitIndex + 1, prop.length) 

     if (key.toLowerCase() === 'timestamp') { 
      obj[key] = (new Date(val)) 
     } else { 
      obj[key] = val 
     } 
     return obj 
    }, {}) 
}) 

console.log(objs.map(obj => { return obj.id })) // [1049105, 993221] 
+0

@BritGwaltney avez-vous vérifié ma réponse mise à jour? – peteb

0

Les dates sont au format ISO, vous pouvez utiliser un couple regexes pour prétraiter la chaîne à JSON

string = "[...]"; 
string.replace(/(\d{4}-\d_2+-\d{2} ... /g, '"$1"'); // enclose dates in quotes 
string.replace(/'/g, '"'); // replace single quotes with double quotes 
string.replace(/id/g, '"id"'); // enclose id in double quotes 
// repeat for api_url and timestamp 

data = JSON.parse(string); 
0

Je suis l'auteur de scanf, voulez-vous essayer ceci:

const {sscanf} = require('scanf'); 

let str = `[{id:1049105, api_url:'', timestamp: 2017-07-12T00:34:36.000Z},{id:993221, api_url:'', timestamp: 2017-07-12T00:34:18.000Z}]`; 
let chunks = str.split('},{'); 

for (let chunk of chunks) { 
    let obj = sscanf(chunk, "id:%d, api_url:%s, timestamp: %s}", 'id', 'api_url', 'timestamp') 
    console.log(obj); 
} 

/* 
{ id: 1049105, 
    api_url: '\'\'', 
    timestamp: '2017-07-12T00:34:36.000Z' } 
{ id: 993221, 
    api_url: '\'\'', 
    timestamp: '2017-07-12T00:34:18.000Z' } 
*/ 

Il peut y avoir un problème avec l'utilisation ou BUG, ​​vous pouvez soumettre issue pour plus.