Skip to content

Instantly share code, notes, and snippets.

@bighunter513
Forked from wweir/j2p
Created May 9, 2019 06:16
Show Gist options
  • Save bighunter513/4bc13d96605006461b84231a52aa432f to your computer and use it in GitHub Desktop.
Save bighunter513/4bc13d96605006461b84231a52aa432f to your computer and use it in GitHub Desktop.
json to protobuf definition transfer tool
#!/usr/bin/env php
<?php
if ($argc == 1) {
$data = fgets(STDIN);
} else {
$file = fopen($argv[1], 'r') or die('read file ' . $argv[1] . ' fail');
$data = fread($file, filesize($argv[1]));
}
$json = json_decode($data) or die('parse input data fail');
echo "message Foobar {\n";
parseJson($json, ' ');
echo "}\n";
function parseJson($obj, $prefix)
{
$count = 0;
foreach ($obj as $key => $val) {
$count++;
switch (gettype($val)) {
case 'boolean':
echo $prefix . 'bool ' . $key . ' = ' . $count . ";\n";
break;
case 'integer':
echo $prefix . 'int64 ' . $key . ' = ' . $count . ";\n";
break;
case 'double':
echo $prefix . 'double ' . $key . ' = ' . $count . ";\n";
break;
case 'string':
echo $prefix . 'string ' . $key . ' = ' . $count . ";\n";
break;
case 'NULL':
echo $prefix . 'google.protobuf.Any ' . $key . ' = ' . $count . ";\n";
break;
case 'array':
switch (gettype($val[0])) {
case 'boolean':
echo $prefix . 'repeated bool ' . $key . ' = ' . $count . ";\n";
break;
case 'integer':
echo $prefix . 'repeated int64 ' . $key . ' = ' . $count . ";\n";
break;
case 'double':
echo $prefix . 'repeated double ' . $key . ' = ' . $count . ";\n";
break;
case 'string':
echo $prefix . 'repeated string ' . $key . ' = ' . $count . ";\n";
break;
case 'NULL':
echo $prefix . 'repeated google.protobuf.Any ' . $key . ' = ' . $count . ";\n";
break;
default:
echo "\n";
echo $prefix . 'message ' . $key . " {\n";
parseJson($val[0], ' ' . $prefix);
echo $prefix . "}\n";
echo $prefix . 'repeated ' . $key . ' ' . $key . ' = ' . $count . ";\n";
echo "\n";
break;
}
break;
case 'object':
echo "\n";
echo $prefix . 'message ' . $key . " {\n";
parseJson($val, ' ' . $prefix);
echo $prefix . "}\n";
echo $prefix . $key . ' ' . $key . ' = ' . $count . ";\n";
echo "\n";
break;
default:
break;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment