This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to parse and read JSON file correctly?

Hi guys,

I am using the nRF52832 board and I want to parse and read my JSON file. I don't have too much experience working with cJSON and here you will find my simple code where I try to understand how to define things properly. I will appreciate a lot if you can help me with some advice or better if you can suggest me where I made errors.

Best regards,

Adnan.

/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <sys/printk.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <float.h>
#include <limits.h>
#include <ctype.h>
#include "cJSON.h"


char *create_hello(void) {
	
	char *string;
	
	cJSON *hello = cJSON_CreateObject();
	
	cJSON *functionName = cJSON_CreateString("hello_world");
	cJSON_AddItemToObject(hello, "functionName", functionName);
	
	string = cJSON_Print(hello);
	
	cJSON_Delete(hello);
	return string;
	
	}

void hello_world (void) {
	
	printk("Hello World! %s\n", CONFIG_BOARD);
	}


void main(void)
{
	const char *hello = "{\"functionName\": \"hello_world\"}";
	cJSON *hello_json = cJSON_Parse(hello);
	cJSON *functionName = cJSON_GetObjectItemCaseSensitive(hello_json, "functionName");
	
	while(true){
		
		if (functionName == "hello_world") {
			hello_world();
			k_sleep(K_SECONDS(1));
			}		
			
		}
}

Parents
  • Hello, Aduka!

    Thank you for reaching out. First of all, have you defined the correct prj.conf for your application? Mine looks like this for the hello_world sample:

    # nothing here
    CONFIG_CJSON_LIB=y
    
    # newlibc
    CONFIG_NEWLIB_LIBC=y

    Secondly, your code is mostly correct, but you have done an illegal comparison in your while loop. Look at my main below, where the error is corrected:

    void main(void)
    {
    	const char *hello = "{\"functionName\": \"hello_world\"}";
    	cJSON *hello_json = cJSON_Parse(hello);
    	char* functionName = cJSON_Print(cJSON_GetObjectItemCaseSensitive(hello_json, "functionName"));
    	
    	while(true){
    		
    		if (strcmp(functionName, "hello_world")) {
    			hello_world();
    			k_sleep(K_SECONDS(1));
    			}		
    			
    		}
    }

    In the code above I have changed line 45 so that cJSON_Print is used to write the content to a string. Then I have changed 49 to use strcmp, for comparing the strings. The line numbers I reference are from your original code. 

    Hope this helps you on your way, and please reach out if you wonder about anything else. 

    Best regards,
    Carl Richard

  • Hi Carl,

    Thanks a lot for this help and suggestions! I tried this code with these corrections, but again I am not able to compile it on my board. Now the problem occurs in my proj.conf file I think.

    This is the error:

    error: Aborting due to Kconfig warnings

    CMake Error at /home/adnan/zephyrproject/zephyr/cmake/kconfig.cmake:217 (message):
    command failed with return code: 1
    Call Stack (most recent call first):
    /home/adnan/zephyrproject/zephyr/cmake/app/boilerplate.cmake:510 (include)
    /home/adnan/zephyrproject/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:24 (include)
    /home/adnan/zephyrproject/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:40 (include_boilerplate)
    CMakeLists.txt:5 (find_package)


    -- Configuring incomplete, errors occurred!
    See also "/home/adnan/zephyrproject/zephyr/build/CMakeFiles/CMakeOutput.log".
    See also "/home/adnan/zephyrproject/zephyr/build/CMakeFiles/CMakeError.log".
    FAILED: build.ninja
    /usr/bin/cmake --regenerate-during-build -S/home/adnan/zephyrproject/zephyr/samples/hello_world_cjson -B/home/adnan/zephyrproject/zephyr/build
    ninja: error: rebuilding 'build.ninja': subcommand failed
    FATAL ERROR: command exited with status 1: /usr/bin/cmake --build /home/adnan/zephyrproject/zephyr/build

    Can you maybe figure out what could be a potential problem now? And also, I forgot to tell that I use Zephyr if that is important for this problem. Also, my last question is related to Makefile and prj.conf files...where I can find the proper configuration for different samples. For sure, I will need to use cJSON together with my BLE example.

    Thanks in advance and best regards,

    Adnan.

  • Thank you for the log. 

    First of all it seems like you haven't defined the ZEPHYR_TOOLCHAIN_VARIANT correctly. For our devices it is gnuarmemb, so depending on your system please set the toolchain variant. 

    Secondly, are you using Zephyr standalone, or our the nRF Connect SDK? 

    Best regards,
    Carl Richard

  • For the Zephyr installation I followed the steps that I found on the official website: https://docs.zephyrproject.org/latest/getting_started/index.html?fbclid=IwAR1gUTysBjMirXA07MMOVa4DoJtHOo1hz0Y7AQbiZeNlsiL41mv5NXvwqX8.

    I used Ubuntu and do you maybe have some rules how can I define that properly and avoid these problems in the future?

    For now, I used only Zephyr standalone with examples that I got after my installation in the zephyrproject documentation. Can I use nRF Connect SDK together with Zephyr RTOS and all example that I get with it?

    I am really sorry if I bother you, but this is the first time that I got the complete answers and suggestions what I perform wrong.

    I really appreciate your help and best regards,

    Adnan.

  • I see that I have to clear some things up. The nRF Connect SDK (NCS) is in fact Nordic-specific code supplementing Zephyr. We maintain our own Zephyr fork, so that all samples and code is available for use with our products. You can read more about how it's tied together here.

    With that said we recommend using NCS with our products as we can't ensure proper function or support when using Zephyr standalone. Hence, you should follow the instructions for setting up NCS, located here. We have tried to make the setup and installation as straight-forward as possible, but we have instructions for manual installation as well.

    This also explains why your code doesn't compile properly, as cJSON is not a part of Zephyr RTOS standalone (they use their own implementation).

    You're no bother! I understand that this is confusing. Please ask if anything else is unclear!

    PS: for standalone Zephyr RTOS support your should look at their official channels.


    Best regards,
    Carl Richard

  • Hi Carl,

    Thanks for this super clear explanation! I have already registered to their official channels and asked the same question, but they also sent me some examples related to nRF Connect. Is it possible to mix these examples from Zephyr and nRF Connect SDK documentation? For example, can I put everything in one folder and use all features for both of them if you understand me what I mean?

    Best regards,

    Adnan.

  • Hello again, Adnan!

    My pleasure. And yes, as the nRF Connect SDK is based on Zephyr it should be no problems to mix them. However, we maintain our own fork of the Zephyr RTOS repo, which usually are a bit behind the main repository. To ensure that your Zephyr version is compatible with the nRF Connect SDK I recommend installing it as linked in my previous comment. This will also give you access to all Zephyr's features.

    Best regards,
    Carl Richard

Reply
  • Hello again, Adnan!

    My pleasure. And yes, as the nRF Connect SDK is based on Zephyr it should be no problems to mix them. However, we maintain our own fork of the Zephyr RTOS repo, which usually are a bit behind the main repository. To ensure that your Zephyr version is compatible with the nRF Connect SDK I recommend installing it as linked in my previous comment. This will also give you access to all Zephyr's features.

    Best regards,
    Carl Richard

Children
Related