0

私は JavaScript の初心者で、redis-cli INFO コマンドの出力を JSON に変換しようとしています。JSONに変換しようとしている文字列は次のようなものです

    "redis_version:2.4.8\r\nredis_git_sha1:b85ba5fb\r\nredis_git_dirty:0\r\narch_bits:64\r\nmultiplexing_api:kqueue\r\ngcc_version:4.2.1\r\nprocess_id:6403\r\nuptime_in_seconds:963411\r\nuptime_in_days:11\r\nlru_clock:815387\r\nused_cpu_sys:67.32\r\nused_cpu_user:91.89\r\nused_cpu_sys_children:42.23\r\nused_cpu_user_children:132.57\r\nconnected_clients:2\r\nconnected_slaves:1\r\nclient_longest_output_list:0\r\nclient_biggest_input_buf:0\r\nblocked_clients:0\r\nused_memory:162549360\r\nused_memory_human:155.02M\r\nused_memory_rss:147972096\r\nused_memory_peak:191943360\r\nused_memory_peak_human:183.05M\r\nmem_fragmentation_ratio:0.91\r\nmem_allocator:libc\r\nloading:0\r\naof_enabled:1\r\nchanges_since_last_save:1\r\nbgsave_in_progress:1\r\nlast_save_time:1350325258\r\nbgrewriteaof_in_progress:0\r\ntotal_connections_received:187\r\ntotal_commands_processed:269264\r\nexpired_keys:180\r\nevicted_keys:0\r\nkeyspace_hits:202518\r\nkeyspace_misses:11675\r\npubsub_channels:0\r\npubsub_patterns:0\r\nlatest_fork_usec:2198\r\nvm_enabled:0\r\nrole:master\r\naof_current_size:159904546\r\naof_base_size:158667118\r\naof_pending_rewrite:0\r\naof_buffer_length:0\r\naof_pending_bio_fsync:0\r\nslave0:127.0.0.1,62716,online\r\ndb0:keys=356937,expires=0\r\n"

これを JSON オブジェクトに変換する方法についての指針は高く評価されています。ありがとう!

4

3 に答える 3

1

次のような単純なことを行うことができます。

​var fields = str.split('\r\n'), result = {};
for(var i = 0, len = fields.length; i < len; ++i) {
    var props = fields[i].split(':');
    if(props.length === 2) {           
        result[props[0]] = props[1];
    }
}

console.log(result);​​​​
console.log(JSON.stringify(result));

http://jsfiddle.net/uHtT3/1/で jsfiddle を作成しました。

于 2012-10-16T05:24:23.667 に答える
0

evalを使ってみましたか?

eval('[{"'+<yourString>+'"}]');

編集

eval('({"'+<yourString>+'"})');

たとえば、文字列としてのjsonは次のようになります。

"a: 21, b:23"

これは私のために働く

var yourString = "redis_version:2.4.8\r\nredis_git_sha1:b85ba5fb\r\nredis_git_dirty:0\r\narch_bits:64\r\nmultiplexing_api:kqueue\r\ngcc_version:4.2.1\r\nprocess_id:6403\r\nuptime_in_seconds:963411\r\nuptime_in_days:11\r\nlru_clock:815387\r\nused_cpu_sys:67.32\r\nused_cpu_user:91.89\r\nused_cpu_sys_children:42.23\r\nused_cpu_user_children:132.57\r\nconnected_clients:2\r\nconnected_slaves:1\r\nclient_longest_output_list:0\r\nclient_biggest_input_buf:0\r\nblocked_clients:0\r\nused_memory:162549360\r\nused_memory_human:155.02M\r\nused_memory_rss:147972096\r\nused_memory_peak:191943360\r\nused_memory_peak_human:183.05M\r\nmem_fragmentation_ratio:0.91\r\nmem_allocator:libc\r\nloading:0\r\naof_enabled:1\r\nchanges_since_last_save:1\r\nbgsave_in_progress:1\r\nlast_save_time:1350325258\r\nbgrewriteaof_in_progress:0\r\ntotal_connections_received:187\r\ntotal_commands_processed:269264\r\nexpired_keys:180\r\nevicted_keys:0\r\nkeyspace_hits:202518\r\nkeyspace_misses:11675\r\npubsub_channels:0\r\npubsub_patterns:0\r\nlatest_fork_usec:2198\r\nvm_enabled:0\r\nrole:master\r\naof_current_size:159904546\r\naof_base_size:158667118\r\naof_pending_rewrite:0\r\naof_buffer_length:0\r\naof_pending_bio_fsync:0\r\nslave0:127.0.0.1".replace(/\r\n/g, ",").replace(/:/g, ": '").replace(/,/g, "' ,")+"'";
eval('({'+yourString+'})');

または、 evalの使用を避けたい場合は、JSON.parseを使用してください

JSON.parse(yourString);
于 2012-10-16T05:31:47.980 に答える
0

同じ目的でwebdisのようなものを使用してみませんか?

デフォルトでは、Webdis 応答は単一の項目を含む JSON オブジェクトであり、要求されたコマンド名を Redis 応答にマッピングします。次の JSON タイプが使用されます。

Redis string → JSON string (GET, LPOP...)
Redis multi-bulk data → JSON list (LRANGE, SMEMBERS...)
Redis integer → JSON integer (INCR...)
Redis status, error → list [bool, string] (PING, SET...)

?jsonp クエリ文字列パラメーターは、オプションのラッピング関数を追加し、応答を JSONP 呼び出しに変換します。これにより、Javascript アプリに Webdis を含めることができます。

于 2012-10-16T05:19:50.503 に答える