@@ -1042,46 +1042,92 @@ namespace YAML
10421042 break ;
10431043 case YAML_SEQUENCE_NODE:
10441044 {
1045- jsonNode[(char *)nodename].to <JsonArray>();
1046- JsonArray nodeArray = jsonNode[(char *)nodename];// .to<JsonArray>();
1045+ #if ARDUINOJSON_VERSION_MAJOR<7
1046+
1047+ JsonArray tmpArray = jsonNode.createNestedArray ((char *)nodename);
1048+ yaml_node_item_t * item_i;
1049+ yaml_node_t *itemNode;
1050+ String _nodeItemName;
1051+ JsonObject tmpObj;
1052+ for (item_i = yamlNode->data .sequence .items .start ; item_i < yamlNode->data .sequence .items .top ; ++item_i) {
1053+ itemNode = yaml_document_get_node (document, *item_i);
1054+ if ( itemNode->type == YAML_MAPPING_NODE ) { // array of anonymous objects
1055+ tmpObj = tmpArray.createNestedObject (); // insert empty nested object
1056+ _nodeItemName = ROOT_NODE + String ( nodename ) + String ( tmpArray.size () ); // generate a temporary nodename
1057+ tmpObj.createNestedObject ((char *)_nodeItemName.c_str ());
1058+ deserializeYml_JsonObject ( document, itemNode, tmpObj, YAMLNode::Type::Sequence, _nodeItemName.c_str (), depth+1 ); // go recursive using temporary node name
1059+ jsonNode[nodename][tmpArray.size ()-1 ] = tmpObj[_nodeItemName.c_str ()]; // remove temporary name and make object anonymous
1060+ } else { // array of sequences or values
1061+ _nodeItemName = " " + String ( nodename );
1062+ deserializeYml_JsonObject ( document, itemNode, jsonNode, YAMLNode::Type::Sequence, _nodeItemName.c_str (), depth+1 );
1063+ }
1064+ }
10471065
1048- yaml_node_item_t * item_i;
1049- yaml_node_t *itemNode;
1050- String _nodeItemName;
1051- JsonDocument copyDoc;
1052- JsonObject tmpObj;
1053- for (item_i = yamlNode->data .sequence .items .start ; item_i < yamlNode->data .sequence .items .top ; ++item_i) {
1054- itemNode = yaml_document_get_node (document, *item_i);
1055- if ( itemNode->type == YAML_MAPPING_NODE ) { // array of anonymous objects
1056- tmpObj = nodeArray.add <JsonObject>(); // insert empty nested object
1057- _nodeItemName = ROOT_NODE + String ( nodename ) + String ( nodeArray.size () ); // generate a temporary nodename
1058- tmpObj[(char *)_nodeItemName.c_str ()].to <JsonObject>();
1059- deserializeYml_JsonObject ( document, itemNode, tmpObj, YAMLNode::Type::Sequence, _nodeItemName.c_str (), depth+1 ); // go recursive using temporary node name
1060- copyDoc.set (tmpObj[_nodeItemName]); // make object anonymous, remove temporary nodename
1061- nodeArray[nodeArray.size ()-1 ].set (copyDoc); // replace array item by reparented node
1062- } else { // array of sequences or values
1063- _nodeItemName = " " + String ( nodename );
1064- deserializeYml_JsonObject ( document, itemNode, jsonNode, YAMLNode::Type::Sequence, _nodeItemName.c_str (), depth+1 );
1066+ #else
1067+
1068+ jsonNode[(char *)nodename].to <JsonArray>();
1069+ JsonArray nodeArray = jsonNode[(char *)nodename];// .to<JsonArray>();
1070+
1071+ yaml_node_item_t * item_i;
1072+ yaml_node_t *itemNode;
1073+ String _nodeItemName;
1074+ JsonDocument copyDoc;
1075+ JsonObject tmpObj;
1076+ for (item_i = yamlNode->data .sequence .items .start ; item_i < yamlNode->data .sequence .items .top ; ++item_i) {
1077+ itemNode = yaml_document_get_node (document, *item_i);
1078+ if ( itemNode->type == YAML_MAPPING_NODE ) { // array of anonymous objects
1079+ tmpObj = nodeArray.add <JsonObject>(); // insert empty nested object
1080+ _nodeItemName = ROOT_NODE + String ( nodename ) + String ( nodeArray.size () ); // generate a temporary nodename
1081+ tmpObj[(char *)_nodeItemName.c_str ()].to <JsonObject>();
1082+ deserializeYml_JsonObject ( document, itemNode, tmpObj, YAMLNode::Type::Sequence, _nodeItemName.c_str (), depth+1 ); // go recursive using temporary node name
1083+ copyDoc.set (tmpObj[_nodeItemName]); // make object anonymous, remove temporary nodename
1084+ nodeArray[nodeArray.size ()-1 ].set (copyDoc); // replace array item by reparented node
1085+ } else { // array of sequences or values
1086+ _nodeItemName = " " + String ( nodename );
1087+ deserializeYml_JsonObject ( document, itemNode, jsonNode, YAMLNode::Type::Sequence, _nodeItemName.c_str (), depth+1 );
1088+ }
10651089 }
1066- }
1090+
1091+ #endif
10671092 }
10681093 break ;
10691094 case YAML_MAPPING_NODE:
10701095 {
1071- JsonObject tmpNode = isRootNode ? jsonNode : jsonNode[(char *)nodename].to <JsonObject>();
1072- yaml_node_pair_t * pair_i;
1073- yaml_node_t * key;
1074- yaml_node_t * value;
1075- for (pair_i = yamlNode->data .mapping .pairs .start ; pair_i < yamlNode->data .mapping .pairs .top ; ++pair_i) {
1076- key = yaml_document_get_node (document, pair_i->key );
1077- value = yaml_document_get_node (document, pair_i->value );
1078- if (key->type != YAML_SCALAR_NODE) {
1079- YAML_LOG_e (" Mapping key is not scalar (line %lu, val=%s)." , key->start_mark .line , SCALAR_c (value) );
1080- continue ;
1096+ #if ARDUINOJSON_VERSION_MAJOR<7
1097+
1098+ JsonObject tmpNode = isRootNode ? jsonNode : jsonNode.createNestedObject ((char *)nodename);
1099+ yaml_node_pair_t * pair_i;
1100+ yaml_node_t * key;
1101+ yaml_node_t * value;
1102+ for (pair_i = yamlNode->data .mapping .pairs .start ; pair_i < yamlNode->data .mapping .pairs .top ; ++pair_i) {
1103+ key = yaml_document_get_node (document, pair_i->key );
1104+ value = yaml_document_get_node (document, pair_i->value );
1105+ if (key->type != YAML_SCALAR_NODE) {
1106+ YAML_LOG_e (" Mapping key is not scalar (line %lu, val=%s)." , key->start_mark .line , SCALAR_c (value) );
1107+ continue ;
1108+ }
1109+ tmpNode.createNestedObject ( SCALAR_s (key) );
1110+ deserializeYml_JsonObject ( document, value, tmpNode, YAMLNode::Type::Map, SCALAR_c (key), depth+1 );
10811111 }
1082- tmpNode[SCALAR_s (key)].add <JsonObject>();
1083- deserializeYml_JsonObject ( document, value, tmpNode, YAMLNode::Type::Map, SCALAR_c (key), depth+1 );
1084- }
1112+
1113+ #else
1114+
1115+ JsonObject tmpNode = isRootNode ? jsonNode : jsonNode[(char *)nodename].to <JsonObject>();
1116+ yaml_node_pair_t * pair_i;
1117+ yaml_node_t * key;
1118+ yaml_node_t * value;
1119+ for (pair_i = yamlNode->data .mapping .pairs .start ; pair_i < yamlNode->data .mapping .pairs .top ; ++pair_i) {
1120+ key = yaml_document_get_node (document, pair_i->key );
1121+ value = yaml_document_get_node (document, pair_i->value );
1122+ if (key->type != YAML_SCALAR_NODE) {
1123+ YAML_LOG_e (" Mapping key is not scalar (line %lu, val=%s)." , key->start_mark .line , SCALAR_c (value) );
1124+ continue ;
1125+ }
1126+ tmpNode[SCALAR_s (key)].add <JsonObject>();
1127+ deserializeYml_JsonObject ( document, value, tmpNode, YAMLNode::Type::Map, SCALAR_c (key), depth+1 );
1128+ }
1129+
1130+ #endif
10851131 }
10861132 break ;
10871133 case YAML_NO_NODE: YAML_LOG_e (" YAML_NO_NODE" );
0 commit comments