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 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

  • 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
    
    
    

Reply
  • 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
    
    
    

Children
Related