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.

  • Hi again, Adnan!

    Sorry to hear that the Linux installation did not work out. Glad to hear that you're trying on windows!

    To include header files in Zephyr (and the nRF Connect SDK) you have to use edit CMakeLists.txt so that CMake is aware of your other files. Have a look at the sample I've attached, where a module "mult.h" has been included in the hello_world sample.

    3704.header_sample.zip

    When editing CMakeLists.txt, make sure to reload the project in SES afterwards.

    Best regards,
    Carl Richard

  • Hi Carl, 

    My main problem is related to the printf function because when I want to print out the temperature value, I am not able to do that. I checked all libraries that I used before, and also added some things in CMakeLists.txt as you sent me before, but still without results. Do you maybe know how can I fix this issue related to printf function inside my Segger sample? 

    Best regards, 

    Adnan. 

  • Hi Adnan!

    To print out to terminal in Zephyr I recommend using the "printk" function, which essentially does the same as "printf". There is a usage example in my previous attachment. 

    Best regards,
    Carl Richard

  • Hi Carl,

    Yes, I know how to use it, but in my example I need to print out the float values, which is not possible with the printk function I think? Correct me if I am wrong.

    Best regards,

    Adnan.

  • Hi, Adnan!

    You are correct, my apologies. To be able to use "printf" and print float values you must add #include <stdio.h> your main, as well as the following configs in prj.conf:

    CONFIG_NEWLIB_LIBC=y
    CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y

    Hope this works for you! 

    Best regards,
    Carl Richard

Reply Children
  • Hi Carl,

    I have already done that, but I am still not able to see outputs in my JLinkRTTViewer. Is there some another way, because I found on the web that I need to install something specific for RTT Viewer? Also, at the end I installed again everything on my Ubuntu. Now my question is related to west function, because I will probably use Ubuntu terminal, not Segger. When I tried to run the command: west build -b nrf52dk_nrf52832 -p, I got an error related to my SDK. Before, you told me that I don't need to install Zephyr SDK. Do I need to install it at the end in order to run the west function or I made mistakes somewhere else?

    Thanks in advance!

    Best regards,

    Adnan.

  • Hi again, Adnan!

    Could you share your prj.conf? In other to achieve proper RTT the following should be present:

    #Activate serial
    CONFIG_SERIAL=y
    
    #Deactivate UART
    CONFIG_UART_CONSOLE=n
    
    #Use RTT for logging
    CONFIG_RTT_CONSOLE=y
    CONFIG_USE_SEGGER_RTT=y

    ----

    What kind of error are you getting? One of the steps in the installation guides I have shared earlier is installing west, so If you've followed those I don't believe that's the problem.

    As I've said earlier, when following the NCS installation guidelines, Zephyr will be installed.

    Best regards,
    Carl Richard

  • Hi Carl, 

    Thanks for this advice related to my proj.conf file! I will send you my proj.conf file to check. I have followed all the NCS installation steps, as we talked about before. Also, I installed Zephyr inside the same folder as nrf, but I think the main problem is in Zephyr-SDK...I did not install it because you told me before that's not necessary to have. But, I send you my error, and then maybe you will be able to see more clearly what the issue is. 

    proj.conf file: 

    CONFIG_BT=y
    CONFIG_BT_DEBUG_LOG=y
    CONFIG_BT_SMP=y
    CONFIG_BT_PERIPHERAL=y
    CONFIG_BT_GATT_DIS=y
    CONFIG_BT_GATT_DIS_PNP=n
    CONFIG_BT_GATT_BAS=y
    CONFIG_BT_DEVICE_NAME="Zephyr Health Thermometer"
    CONFIG_BT_DEVICE_APPEARANCE=768
    CONFIG_BT_ATT_ENFORCE_FLOW=n
    CONFIG_ADC=y
    CONFIG_LOG=y
    CONFIG_LOG_PRINTK=y
    CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
    CONFIG_NEWLIB_LIBC=y
    
    
    

  • Hi again.

    If you add the config lines from my previous comment to your prj.conf I believe it should work.

    When it comes build problems. Can you try to run the command "West update" and provide me the output? And to repeat myself, the SDK is necessary, but it's installed in the NCS folder when running west init -m github.com/.../sdk-nrf --mr <ncs_revision_here>.

    Best regards,
    Carl Richard

  • Hi again,

    I added the new lines in my configuration file and now it works properly. Thanks a lot! I know I installed sdk-nrf, but I think that the Zephyr SDK is mentioned in the error...or I am missing something? Also, do you maybe have some examples where I can find how to use non-volatile memory? 

    Thanks in advance, 

    Adnan.

Related