我正在创建一个基于v8 shell的控制台,我采用了v8附带的示例代码并且它运行良好,但我正在尝试将v8 ::对象转换为它的字符串版本(json)但是没有找到一个这样做的方式.
这是我在shell.cc中的示例代码:
v8::Handle test(const v8::Arguments& args) {
v8::HandleScope handle_scope;
const char* json;
v8::String::Utf8Value strJson(args[0]);
printf(ToCString(json));
if (args[0]->IsObject()) {
printf("it's an object\n");
}
return v8::String::New("");
}
Run Code Online (Sandbox Code Playgroud)
在shell中我创建了一个文件test.js:
var a = { name: 'John' };
test(a);
Run Code Online (Sandbox Code Playgroud)
我在shell控制台中执行js后得到这个:
[object Object]
It's an object
Run Code Online (Sandbox Code Playgroud)
我想要的是:
{ "name": "John" }
Run Code Online (Sandbox Code Playgroud)
如果我将js代码更改为:
var a = { name: 'John'}
test(JSON.stringify(a));
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但我不希望用户必须知道如何将javascript变量解析为json,我不想检查对象的每个输入并手动解析它.
有没有办法在C中的shell.cc代码中执行相同的指令?就像是:
v8::Handle<v8::String> temp = JSON.parse(arg[0]);
Run Code Online (Sandbox Code Playgroud)
更新:我正在处理这个问题,但我想要一个更清洁的方法来做同样的事情:
const char* toJson(const v8::Local<v8::Object>& obj) {
std::stringstream ss;
ss << "{";
v8::Local<v8::Array> propertyNames = obj->GetPropertyNames();
for (int …Run Code Online (Sandbox Code Playgroud) 我在节点restful server中使用stringify来提供数据:
answer = JSON.stringify({activities: result}, null, '\t');
return answer
Run Code Online (Sandbox Code Playgroud)
其中result是一个js对象; 我收到了正确的输出:
{
"activities": [
{
"id": 1,
"title": aaa
},
{
"id": 2,
"title": bbb
}
]
}
Run Code Online (Sandbox Code Playgroud)
但现在我想在stringify函数的左边部分使用变量而不是固定字符串; 就像是:
var name = "activities";
answer = JSON.stringify({name: result}, null, '\t');
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为name成为字符串化对象中的固定字符串
我发现,如果您.toJSON()为对象定义函数,那么它将用于字符串化对象,而不是默认值。有没有办法忽略这个覆盖的函数并运行默认的 stringify 进程?
如何使用 GNU gfortran 对预处理器宏进行字符串化?我想将宏定义传递给 GNU gfortran,然后将其用作代码中的字符串。
实际上,我想这样做:
program test
implicit none
character (len=:), allocatable :: astring
astring = MYMACRO
write (*, *) astring
end program test
Run Code Online (Sandbox Code Playgroud)
然后构建:
gfortran -DMYMACRO=hello test.F90
Run Code Online (Sandbox Code Playgroud)
我尝试创建各种宏,例如:
#define STRINGIFY_(x) #x
#define STRINGIFY(x) STRINGIFY_(x)
...
astring = STRINGIFY(MYMACRO)
Run Code Online (Sandbox Code Playgroud)
但这不适用于 gfortran 预处理器。
我还尝试使用不同风格的宏:
#define STRINGIFY(x) "x"
...
astring = STRINGIFY(MYMACRO)
Run Code Online (Sandbox Code Playgroud)
但这只会创建一个包含文本“MYMACRO”的字符串。
然后我尝试将宏定义更改为:
-DMYMACRO=\"hello\"
Run Code Online (Sandbox Code Playgroud)
但这在构建过程中导致了无关的问题。
感谢您的帮助
我想要一个像这样调用的宏:
GCC_WARNING(-Wuninitialized)
Run Code Online (Sandbox Code Playgroud)
它扩展为这样的代码:
_Pragma("GCC diagnostic ignored \"-Wuninitialized\"")
Run Code Online (Sandbox Code Playgroud)
我没有运气让这个工作,因为预处理器加入和字符串化的常用技巧似乎不适用或我不知道如何在这里应用它们.
我们的一些用户仍然使用IE8.当尝试将数据发布到我们的服务器时,他们中的一些偶尔会报告问题(通过标记为"SAVE"的大按钮).
IE8显示的脚本错误是:意外调用方法或属性访问,始终指向KnockoutJS 2.2.0(现在调试)库450行中的同一行,如下所示:
return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space);
Run Code Online (Sandbox Code Playgroud)
我的代码中的方法位于堆栈跟踪的根部,发生这种情况的方法如下:
self.saveSingle = function (onSuccess, onFailure) {
ko.utils.arrayForEach(self.days(), function (day) {
day.close();
});
var jsonData = ko.toJSON(self);
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: applicationLocation + "/api/assignmentapi/save",
data: jsonData,
success: function (data) {
self.status(data.Status);
self._isDirty(false);
ko.utils.arrayForEach(self.days(), function (day) {
day.clean();
});
if (onSuccess)
onSuccess();
},
error: function (data) {
onFailure();
},
dataType: "json"
});
};
Run Code Online (Sandbox Code Playgroud)
当我们将对象转换为JSON时,我们会删除一些对POST不必要的属性,使用这种方法:http://www.knockmeout.net/2011/04/controlling-how-object-is-converted -to.html
OurType.prototype.toJSON = function () {
var copy = ko.toJS(this);
delete copy.someUnneededProperty1; …Run Code Online (Sandbox Code Playgroud) JSON不是JavaScript的子集.我需要我的输出是100%有效的JavaScript; 它将被评估为 - 即,JSON.stringify不会(总是)满足我的需求.
是否有Node的JavaScript字符串?
作为奖励,如果它可以串联对象将是很好的.
我正在寻找一个对象的字符串.
{"1":{"valeur":"dalebrun","usager":"experttasp","date":"2013-08-20 16:41:50"}, "2": {"valeur":"test","usager":"experttasp","date":"2013-08-20 16:41:50"}}
Run Code Online (Sandbox Code Playgroud)
{"valeur":"dalebrun","usager":"experttasp","date":"2013-08-20 16:41:50"}, {"valeur":"test","usager":"experttasp","date":"2013-08-20 16:41:50"}
Run Code Online (Sandbox Code Playgroud)
var objVal = {}; //value....
var data = {}; //other value....
var object = $.extend({}, objVal, data); //concat the object
JSON.stringify(object);
Run Code Online (Sandbox Code Playgroud) 可能是重复的问题,但找不到答案。我想将包含一些 JSON 字符串作为值的 javascript 对象字符串化。
例如:
var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};
Run Code Online (Sandbox Code Playgroud)
如您所见,键 'options' 的值是一个 JSON 字符串。我想对对象“obj”进行字符串化,而不对内部 JSON 字符串进行双重字符串化。
除了使用 JSON 字符串解析每个值并将对象字符串化之外,是否有任何干净整洁的解决方案?
问题:我似乎无法找到一个令人满意的解释,为什么javascript Maps需要使用方括号来使JSON.stringify方法"到达"(?)到嵌套元素中.我想我错过了关于ES6的一些东西,或Map数据类型固有的东西.
我可以将Map转换为对象,并使用stringify-但为什么这个额外的步骤是必要的?
我的实验:
const blah = new Map();
blah.set('u', {
'something': [{'hey':98}, 56, 'bob']
});
blah.set({
'hey': {'hey': 78}
}, 'what?');
console.log(JSON.stringify(...blah));
//["u",{}]
//I thought this would yield the result of the below console.log
console.log(JSON.stringify([...blah]))
//[["u",{"something":[{"hey":98},56,"bob"]}],[{"hey":{"hey":78}},"what?"]]
//Why are the square brackets needed to stringify and display each element of
//the map?
Run Code Online (Sandbox Code Playgroud)
这条确认的行为,但并没有解释为什么会发生.
stringify ×10
javascript ×6
json ×5
node.js ×2
object ×2
brackets ×1
c ×1
default ×1
ecmascript-6 ×1
fortran ×1
gfortran ×1
knockout.js ×1
macros ×1
overriding ×1
parsing ×1
pragma ×1
preprocessor ×1
v8 ×1