2017-07-12 23 views
0

私はこの文字列を解析可能にするのが最も難しい時です。それは単純な仕事のように見えるかもしれませんが、それは私を夢中にしています。 Infusionsoftはこれを残りのフックのペイロードとして返します。したがって、受信方法を変更することはできません。JSONとして文字列配列を解析する方法は?

JSON.parse()タイムスタンプに引用符がないため、オブジェクトリテラルとしては機能しません。方法や方法がありますか?私はこれを解析するために見たことがありませんでしたので、簡単にforループを使って各idを得ることができますか?

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

任意の助けいただければ幸いです。

+1

これはまったく有効なJSONではありません。そのプロパティはすべて有効であるためには、それらの周りの引用符を使用する必要があります。 – wilsonhobbs

+0

あなたはすべてを解析しようとしていますか?あなたはもう少し明確になりますか? –

+1

APIから有効なJSONを取得しているという気がしますが、すでに解析済みです。たとえば、 'json'データ型を指定して' jQuery.ajax'を使用して、要求をサーバに送信する場合です。その場合は、あなたの質問に解析されたオブジェクトのログ出力を貼り付けたかもしれません。もしそうなら、 'JSON.parse()'はまったく必要ありません。そうでない場合は、コードサンプルを貼り付けて、自分が何をしているのかを見やすくすることをお勧めします。 – Marconius

答えて

0

文字列の一部を操作して文字列部分を反復することで、この応答を有効なJSオブジェクトの配列に解析できます。

私は以下のコードを実行して、配列文字列の各 "オブジェクト"に対応するJSオブジェクトの配列を取得します。また、無効なタイムスタンプ値をJS Dateオブジェクトに変換します。

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あなたは更新された回答をチェックアウトしましたか? – peteb

0

日は、あなたがこれを試すたいと思い、あなたは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

に前処理に文字列をカップルの正規表現を使用することができますので、私はscanfの作家だ、ISO形式である:

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' } 
*/ 

使用方法やBUGに問題がある場合は、issueを送信してください。

関連する問題