2017-01-12 12 views
1

*が必要*総初心者が新しい、完全な、JSONデータで編集ヘルプ構文解析複雑なJSONアレイ

私は総コーディング初心者だとして事前に謝罪するつもりです。プロジェクトをしようと決めたマネージャー。

次の醜いJSON結果を解析するためにコードスニペットを手伝ってくれることを願っていました。これはAPIコールの結果であり、4つの「レコード」を含みます。書式設定のためにスニペットとして貼り付ける必要がありました。

{"url":"http://www.msasnow.org/trail-reports/pere-marquette-snowmobile-club/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/pere-marquette-snowmobile-club/","resourceId":"29ce67ff3db8907d01f84ad45b6b47e4","data":[{"group":[{"trailName":[{"text":"Pere Marquette Snowmobile Club Trail Report"}],"trailCondition":[{"text":"Fair"}],"reportDate":[{"text":"January 10th, 2017 @ 11:20am"}]}]}]},"pageData":{"resourceId":"29ce67ff3db8907d01f84ad45b6b47e4","statusCode":200,"timestamp":1484190106983},"timestamp":1484190107253,"sequenceNumber":0}} 
 
{"url":"http://www.msasnow.org/trail-reports/greater-grayling-snowmobile-assoc/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/greater-grayling-snowmobile-assoc/","resourceId":"660750825d7a7e665acfd3a94ac3d20e","data":[{"group":[{"trailName":[{"text":"Greater Grayling Snowmobile Assoc. Trail Report"}],"trailCondition":[{"text":"Good"}],"reportDate":[{"text":"January 09th, 2017 @ 10:50am"}]}]}]},"pageData":{"resourceId":"660750825d7a7e665acfd3a94ac3d20e","statusCode":200,"timestamp":1484190108241},"timestamp":1484190108467,"sequenceNumber":1}} 
 
{"url":"http://www.msasnow.org/trail-reports/st-helen-snowmobile-club/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/st-helen-snowmobile-club/","resourceId":"63ba9e57962c0103cf401021656d5231","data":[{"group":[{"trailName":[{"text":"St. Helen SnowPackers Snowmobile Club Trail Report"}],"trailCondition":[{"text":"Poor"}],"reportDate":[{"text":"January 09th, 2017 @ 5:02pm"}]}]}]},"pageData":{"resourceId":"63ba9e57962c0103cf401021656d5231","statusCode":200,"timestamp":1484190108869},"timestamp":1484190109341,"sequenceNumber":2}} 
 
{"url":"http://www.msasnow.org/trail-reports/cadillac-winter-promotions/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/cadillac-winter-promotions/","resourceId":"d977860e12e8d285d5e7ea21e17bf43e","data":[{"group":[{"trailName":[{"text":"Cadillac Winter Promotions Trail Report"}],"trailCondition":[{"text":"Good"}],"reportDate":[{"text":"January 10th, 2017 @ 3:25pm"}]}]}]},"pageData":{"resourceId":"d977860e12e8d285d5e7ea21e17bf43e","statusCode":200,"timestamp":1484190110156},"timestamp":1484190110365,"sequenceNumber":3}}

私は(私はその部分を下に持っている)私は、Webページでそれらを書き出すことができるように、各レコードからtrailName、trailCondition、およびreportDate値を抽出しようとしています。しかし、 "値"はツリーの下のノードにあり、複数のレコードがあるので、私は迷っています。

JSONはimport.ioによって作成されたもので、私はそれをまったく変更する能力がありません。

私はjavascriptを試みていましたが、すべてのオプションを開いています...コーディング新生児に対応しています。

あなたの貴重な時間をありがとう、と慈悲...マルク

+0

JSON.parseを使用してJSON文字列を解析する –

+0

http:// jsonprettyprintのようなものを使用します。comで、JSONの構造を見ることができます(これは偶然にも '配列'ではありません)。それを構文解析した後、標準のjs表記法を使って必要なビットを抽出することができます – pvg

答えて

1

フォーマットは粒状のようで、おそらく重要なことができるもののためにオブジェクトと配列を使用してジョブは容易ではありません:valueのペア。一般的な解決策には少しの努力が必要です。

グループの配列内にあるように思われるデータを明示的に取得する方法は次のとおりです。たぶんあなたはそれをあなたが望むものに適応させることができます。

var data = JSON.parse('{"url":"http://www.msasnow.org/trail-reports/pere-marquette-snowmobile-club/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/pere-marquette-snowmobile-club/","resourceId":"bb56c59af972a87e62bcba4206a05d4d","data":[{"group":[{"Trail Name":[{"text":"Pere Marquette Snowmobile Club Trail Report"}],"Trail Condition":[{"text":"Fair"}],"Report Date":[{"text":"January 10th, 2017 @ 11:20am"}]}]}]},"pageData":{"resourceId":"bb56c59af972a87e62bcba4206a05d4d","statusCode":200,"timestamp":1484143736420},"timestamp":1484143957298,"sequenceNumber":0}}'); 
 

 
// Get the group, which is an array 
 
var group = data.result.extractorData.data[0].group; 
 

 
// Get data from the group 
 
group.forEach(function(group) { 
 
    Object.keys(group).forEach(function(key) { 
 
    console.log(key + ': ' + group[key][0].text); 
 
    }); 
 
});

編集したOPに基づき、次のように複数のレコードを処理します。注意すべき部分はデータグループの配列です。あなたの例は1つのグループしか持たないので、コードはdata[0].groupになります。

フォーマットは、各データアレイ内の複数のグループオブジェクトを可能にするので、おそらくいくつかの巧妙な人は、将来的にその使用を作る(または多分ないが、それは警戒するのは簡単だ)します。

データの配列をループし、各グループを抽出する必要があります。つまり、単一のオブジェクトだけでなく、結果オブジェクトの配列を返すことにも対処する必要があります。

// Assuming data arrives as records separated by returns 
 
var data = '{"url":"http://www.msasnow.org/trail-reports/pere-marquette-snowmobile-club/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/pere-marquette-snowmobile-club/","resourceId":"29ce67ff3db8907d01f84ad45b6b47e4","data":[{"group":[{"trailName":[{"text":"Pere Marquette Snowmobile Club Trail Report"}],"trailCondition":[{"text":"Fair"}],"reportDate":[{"text":"January 10th, 2017 @ 11:20am"}]}]}]},"pageData":{"resourceId":"29ce67ff3db8907d01f84ad45b6b47e4","statusCode":200,"timestamp":1484190106983},"timestamp":1484190107253,"sequenceNumber":0}}\n' + 
 
      '{"url":"http://www.msasnow.org/trail-reports/greater-grayling-snowmobile-assoc/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/greater-grayling-snowmobile-assoc/","resourceId":"660750825d7a7e665acfd3a94ac3d20e","data":[{"group":[{"trailName":[{"text":"Greater Grayling Snowmobile Assoc. Trail Report"}],"trailCondition":[{"text":"Good"}],"reportDate":[{"text":"January 09th, 2017 @ 10:50am"}]}]}]},"pageData":{"resourceId":"660750825d7a7e665acfd3a94ac3d20e","statusCode":200,"timestamp":1484190108241},"timestamp":1484190108467,"sequenceNumber":1}}\n' + 
 
      '{"url":"http://www.msasnow.org/trail-reports/st-helen-snowmobile-club/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/st-helen-snowmobile-club/","resourceId":"63ba9e57962c0103cf401021656d5231","data":[{"group":[{"trailName":[{"text":"St. Helen SnowPackers Snowmobile Club Trail Report"}],"trailCondition":[{"text":"Poor"}],"reportDate":[{"text":"January 09th, 2017 @ 5:02pm"}]}]}]},"pageData":{"resourceId":"63ba9e57962c0103cf401021656d5231","statusCode":200,"timestamp":1484190108869},"timestamp":1484190109341,"sequenceNumber":2}}\n' + 
 
      '{"url":"http://www.msasnow.org/trail-reports/cadillac-winter-promotions/","result":{"extractorData":{"url":"http://www.msasnow.org/trail-reports/cadillac-winter-promotions/","resourceId":"d977860e12e8d285d5e7ea21e17bf43e","data":[{"group":[{"trailName":[{"text":"Cadillac Winter Promotions Trail Report"}],"trailCondition":[{"text":"Good"}],"reportDate":[{"text":"January 10th, 2017 @ 3:25pm"}]}]}]},"pageData":{"resourceId":"d977860e12e8d285d5e7ea21e17bf43e","statusCode":200,"timestamp":1484190110156},"timestamp":1484190110365,"sequenceNumber":3}}'; 
 

 
// Function to process each record and return an object like: 
 
// {trailName: value, 
 
// trailCondition: value, 
 
// reportDate: value} 
 
function processRecord(record) { 
 
    record = JSON.parse(record); 
 
    var group = record.result.extractorData.data[0].group; 
 
    var result = {} 
 
    group.forEach(function(group) { 
 
    Object.keys(group).forEach(function(key) { 
 
     result[key] = group[key][0].text; 
 
    }); 
 
    }); 
 
    return result; 
 
} 
 
       
 
// Split the data into records on new lines, 
 
// Process each record and return result objects in an array 
 
var processedData = data.split('\n').map(record => processRecord(record)); 
 

 

 
// Display results: for each record, write out each key and its value 
 
processedData.forEach(function (record) { 
 
    Object.keys(record).forEach(function(key) { 
 
    console.log(key + ': ' + record[key]); 
 
    }) 
 
}); 
 

 
// Which can also be written using arrow functions, but it's a bit obfuscated: 
 
/* 
 
processedData.forEach(record => 
 
    Object.keys(record).forEach(key => 
 
    console.log(key + ': ' + record[key]) 
 
) 
 
); 
 
*/

また、テーブルとして結果をフォーマットすることもできますが、私はあなたにそれを任せます。 ;-)

+0

RobG - このコードをありがとう、私は元々は投稿で持っていたJSONを使って動作させることができました。私はそれをマルチレコードのデータで更新し、複数の "レコード"に適用するのがいかに難しいのだろうと思っていました。私は、HTTPリクエストからそれを忠実に呼び出すときに、別の方法で処理されると仮定します。もう一度ありがとう!私の息子はやっと私の小さなプロジェクトに興味を持っています。 –

+0

あなたが投稿したデータは有効なJSONではありません。配列リテラル ''{... record ...}、{... record ...}、{... record ...}あなたが投稿したものではなく '' {... record ...} {... record ...} {... record ...} ''のように、上記は、単一のレコードを受け入れる関数にリファクタリングすることができます。その後、データを個々のレコードに分割し、一度に1つずつ関数に渡すことができます。 – RobG

関連する問題