在JSMN库实现之下。它在传入的JSON消息中搜索“command”,“rf_type”和“Filter”的位置。现在程序自动打印提取的字符串。我需要将它传递给另一个变量并在另一个函数中使用该字符串。
start->从JSON提取命令 - >传递给另一个函数 - >结束
在这种情况下,任何人都可以指导如何将字符串打印到变量
printf("===============================\n");
for (i = 1; i < r; i++) {
if (jsoneq(JSON_STRING, &t[i], "command") == 0)
{
printf("- command: %.*s\n", t[i+1].end-t[i+1].start,
JSON_STRING + t[i+1].start);
i++;
}
else if (jsoneq(JSON_STRING, &t[i], "rf_type") == 0)
{
printf("- rf_type: %.*s\n", t[i+1].end-t[i+1].start,
JSON_STRING + t[i+1].start);
i++;
}
else if (jsoneq(JSON_STRING, &t[i], "filter") == 0)
{
printf("- filter: %.*s\n", t[i+1].end-t[i+1].start,
JSON_STRING + t[i+1].start);
i++;
}
else
{
printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
JSON_STRING + t[i].start);
}
}
return 1;
答案 0 :(得分:1)
这是用于接收消息和比较的全功能实现。
int msgarrvd(void *context, char *topicName, int topicLen,MQTTClient_message *message)
{
int i;
char* payloadptr;
char *test[256];
printf("Message arrived\n");
printf("topic: %s\n", topicName);
printf("===============================\n");
payloadptr = message->payload;
for(i=0; i<message->payloadlen; i++)
{
JSON_STRING[i]=*payloadptr++;
//putchar(*payloadptr++);
printf("%c", JSON_STRING[i]);
}
putchar('\n');
MQTTClient_freeMessage(&message);
MQTTClient_free(topicName);
jsmn_init(&p);
r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0]));
if (r < 0) {
printf("Failed to parse JSON: %d\n", r);
}
if (r < 1 || t[0].type != JSMN_OBJECT) {
printf("Not Valid JSON-HCI_HUB\n");
}
printf("===============================\n");
for (i = 1; i < r; i++) {
if (jsoneq(JSON_STRING, &t[i], "command") == 0)
{
printf("- command: %.*s\n", t[i+1].end-t[i+1].start,
JSON_STRING + t[i+1].start);
test[256]=t[i+1].end-t[i+1].start,JSON_STRING + t[i+1].start;
printf("%s\n",&test);
i++;
}
else if (jsoneq(JSON_STRING, &t[i], "rf_type") == 0)
{
printf("- rf_type: %.*s\n", t[i+1].end-t[i+1].start,
JSON_STRING + t[i+1].start);
i++;
}
else if (jsoneq(JSON_STRING, &t[i], "filter") == 0)
{
printf("- filter: %.*s\n", t[i+1].end-t[i+1].start,
JSON_STRING + t[i+1].start);
i++;
}
else
{
printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
JSON_STRING + t[i].start);
}
}
return 1;
}
答案 1 :(得分:0)
else
{
printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
JSON_STRING + t[i].start);
}
对我来说非常可疑 我希望
else
{
printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
(const char *) t[i].start);
}
为什么要将JSON_STRING枚举类型常量添加到指针?
答案 2 :(得分:0)
考虑使用tiny-json。它不仅是一个标记器。您可以以字符串格式获取数据,或者在C类型变量中获取原语值而不会丢失性能。
您可以通过两种方式使用。您可以一对一地获取JSON字段。
char str[] = "{\"command\":\"qwerty\",\"rf_type\":2,\"filter\":\"low pass\",\"unexpected\":\"hello\"}";
puts( str );
json_t pool[5];
json_t const* root = json_create( str, pool, 5 );
if ( root ) {
json_t const* field = json_getChild( root );
while( field ) {
char const* name = json_getName( field );
char const* value = json_getValue( field );
if ( !strcmp( name, "command") )
printf("- command: %s\n", value );
else if ( !strcmp( name, "rf_type") )
printf("- rf_type: %s\n", value );
else if ( !strcmp( name, "filter") )
printf("- filter: %s\n", value );
else
printf("Unexpected message. Name: '%s', Value: '%s'.\n", name,value );
field = json_getSibling( field );
}
}
或者按名字获取他们的价值观。这有助于您节省大量的源代码行和开发时间。
char str[] = "{\"command\":\"qwerty\",\"rf_type\":2,\"filter\":\"low pass\"}";
puts( str );
json_t pool[4];
json_t const* root = json_create( str, pool, 4 );
if ( root ) {
char const* command = json_getPropertyValue( root, "command" );
if ( command ) printf("- command: %s\n", command );
char const* rf_type = json_getPropertyValue( root, "rf_type" );
if ( rf_type ) printf("- rf_type: %s\n", rf_type );
char const* filter = json_getPropertyValue( root, "filter" );
if ( filter ) printf("- filter: %s\n", filter );
}
如果要将json属性保留在文本中,则必须使用strcpy()创建字符串副本。