diff --git a/compiler2/record.c b/compiler2/record.c
index a8f1eb0c0817830223fb0d613bc363a9f3eec4c6..805dc50c07410724c5e33201fa202f9081c78c90 100644
--- a/compiler2/record.c
+++ b/compiler2/record.c
@@ -3512,6 +3512,9 @@ char* generate_json_decoder(char* src, const struct_def* sdef)
     src = mputprintf(src,
       "{\n"
                // invalid field name
+      "        if (p_silent) {\n"
+      "          return JSON_ERROR_INVALID_TOKEN;\n"
+      "        }\n"
       "        JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, %sJSON_DEC_INVALID_NAME_ERROR, (int)name_len, fld_name);\n"
                // if this is set to a warning, skip the value of the field
       "        dec_len += p_tok.get_next_token(&j_token, NULL, NULL);\n"
diff --git a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn
index 4dcc60bcfaa098e96179d12b6bdf3c2f716a16f4..9a276a5a4aeb969ab772efc12429e174bf706506 100644
--- a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn
+++ b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn
@@ -844,6 +844,34 @@ testcase tc_bug_522660() runs on MTC {
   }
 }
 
+testcase tc_bug_568645() runs on MTC {
+  var universal charstring stream := "{ \"i1\":123}";
+  var Uni568645 pdu_decoded;
+  var Uni568645 pdu_expected := { field1 := { i1 := 123 } };
+  var integer result := decvalue_unichar(stream, pdu_decoded);
+  if (result != 0 or pdu_decoded != pdu_expected) {
+    setverdict(fail, "Test #1 failed. Result: ", result, ". Decoded value: ",
+      pdu_decoded, ", expected: ", pdu_expected);
+  }
+  
+  stream := "{ \"i1\":123, \"i2\":456}";
+  pdu_expected := { field2 := { i1 := 123, i2 := 456 } };
+  result := decvalue_unichar(stream, pdu_decoded);
+  if (result != 0 or pdu_decoded != pdu_expected) {
+    setverdict(fail, "Test #2 failed. Result: ", result, ". Decoded value: ",
+      pdu_decoded, ", expected: ", pdu_expected);
+  }
+  
+  stream := "{ \"i1\":123, \"i2\":[1,2,3]}";
+  pdu_expected := { field3 := { i1 := 123, i2 := { 1, 2, 3 } } };
+  result := decvalue_unichar(stream, pdu_decoded);
+  if (result != 0 or pdu_decoded != pdu_expected) {
+    setverdict(fail, "Test #3 failed. Result: ", result, ". Decoded value: ",
+      pdu_decoded, ", expected: ", pdu_expected);
+  }
+  setverdict(pass);
+}
+
 //=========================================================================
 // Control
 //=========================================================================
@@ -935,6 +963,7 @@ control {
   execute(tc_multi_level_recordof());
   
   execute(tc_bug_522660());
+  execute(tc_bug_568645());
 }
 
 
diff --git a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn
index bdc7fbc24b11e63aeae196a6855140b81e40e247..2b8f6a06c34b81ec213e313e42a40a640818c237 100644
--- a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn
+++ b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn
@@ -395,6 +395,29 @@ with {
 
 type record of EnumNumber EnumNumberList;
 
+type union Uni568645 {
+  Set568645a field1,
+  Set568645b field2,
+  Set568645c field3
+}
+with {
+  variant "JSON: as value"
+}
+
+type set Set568645a {
+  integer i1
+}
+
+type set Set568645b {
+  integer i1,
+  integer i2
+}
+
+type set Set568645c {
+  integer i1,
+  record of integer i2
+}
+
 } with {
   encode "JSON";
   extension "anytype integer, charstring, R, RoI, Thing";