JsonConverter.DeserializeObject stuck forever2

Got an issue with an invalid JSON object being read from a USB stick, causing the JsonConverter.DeserializeObject to, what I assume, get stuck in a recursive call as it increases memory usage by 0.5% every 5 seconds, eventually causing the SCM20260E to run out of memory and crash.

As I’m unable to attach the file containing the JSON, I guess I can email it upon request. Here is a subpart of the JSON that I assume is causing the issue:

{

"MessageQueueObject" : [

{

"ResendAttempts" : 0,

"MessageDTO" : {

"Id" : "712bccda-b5f6-2474-2f67-6106f3728610",

"ComponentId" : "",

"DeliveryTag" : 0,

"MessageType" : 11,

"SendAck" : false,

"Value" : "{ \"Id\" : \"8babcc94-66aa-4997-bc60-b48203f5b3e6\", \"Quality\" : true, \"TimeStamp\"1791 �K���X�X�����Xָ��1792 �#՚�X�X��՚�X����1793 �W ��X�X�� ��Xeθ��1794 �7M��X�X��M��X����1795 �>���X�X�����X!����1796 �����X�X�����X$����1797 ��X�X��X'����1798 �"��X�X��"��X*f���1799 ��V��X�X��W��X-����1800 �����X�X�����X0���1801 �M˜�X�X��˜�X3p���1802 ���X�X����X6����1803 ��9��X�X��:��X9����1804 �"p��X�X��q��X<����1805 �����X�X�����X?y���1806 �=杺X�X��杺XBu���1807 ����X�X����XE����1808 ��P��X�X��P��XH����1809 �����X�X�����XK����1810 �|���X�X�����XN����1811 �,���X�X�����XQ����1812 �S<��X�X��<��XT����1813 �nr��X�X��r��XW����1814 ��'��X�X��'��XZ����1815 ��\��X�X��]��X]����1816 �$���X�X�����X`]���1817 �nҠ�X�X��Ҡ�Xc����1818 �<��X�X����Xf����1819 ��K��X�X��K��Xi����1820 �����X�X�����Xl����1821 �Tá�X�X��á�Xo����1822 ����X�X����Xr}���1823 ��8��X�X��9��Xu����1824 �kt��X�X��t��Xxq���1825 �����X�X�����X{����1826 �T梺X�X��梺X~Z���1827 �e(��X�X��(��X�v���1828 ��[��X�X��[��X�����1829 �a���X�X�����X�y���1830 �,ͣ�X�X��ͣ�X�o���1831 �Ua��X�X��a��X�t���1832 ��6��X�X��7��X�x���1833 �eo��X�X��o��X�����1834 �J���X�X�����X�����1835 �Xݤ�X�X��ݤ�X�p���1836 �} ��X�X�� ��X�����1837 �eT��X�X��T��X�M���1838 �����X�X�����X�p���1839 �����X�X��¥�X�d���1840 �8���X�X�����X�����1841 � 2��X�X��2��X�����1842 �ak��X�X��k��X�����1843 �j���X�X�����X�x���1844 �㦺X�X��㦺X�����1845 ���X�X����X�����1846 �LN��X�X��N��X�r���1847 �t��X�X����X�����1848 � =��X�X��=��X�����1849 �Gw��X�X��w��X�����1850 �����X�X�����X�|���1851 ��X�X��墨X�n���1852 ��$��X�X��$��X�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Stamp\" : \"2024-05-26T21:04:55.627Z\", \"Value\" : 50.0130005, \"diff\" : 0.00100000005, \"IntervalSeconds\" : 3600}"

}

}]

}

Method call:

StorageLogFile baseObject = (StorageLogFile)_jsonConvertWrapper.DeserializeObject(
  log,
  typeof(StorageLogFile),
  JsonObjectType.StorageLogFile);

Test class:

using System;
using System.Text;
using GHIElectronics.TinyCLR.Data.Json;

namespace Hardware.JSON
{
  public enum JsonObjectType
  {
      StorageLogFile,
  }

  public class JsonConvertWrapper
  {  
      public virtual object DeserializeObject(string jsonStr, Type type, JsonObjectType jsonObjectType)
      {
          
          InstanceFactory factory = null;

          switch (jsonObjectType)
          {
              case JsonObjectType.StorageLogFile: //Rename
                  factory = MessageQueueObjectArray;
                  break;
          }

          return JsonConverter.DeserializeObject(jsonStr, type, factory);
      }

      private object MessageQueueObjectArray(string instancePath, JToken token, Type baseType, string fieldName, int length)
      {
          if (instancePath == "//MessageQueueObject")
          {
              return new MessageQueueObject();
          }

          if (fieldName == "MessageQueueObject")
          {
              return new MessageQueueObject[length];
          }

          if (baseType == typeof(MessageDTO)) return new MessageDTO();
          if (baseType == typeof(StorageLogFile)) return new StorageLogFile();
      {
  }

  public class StorageLogFile
  {
      public MessageQueueObject[] MessageQueueObject;
  }
  public class MessageQueueObject
  {
      public int ResendAttempts { get; set; }
  
      public MessageDTO MessageDTO { get; set; }
  }
}

I wrote the JSON classes an eon or two ago. I haven’t had a chance to look at the code with respect to the input you’ve provided, but I will over the next few days.

The Value field isn’t valid JSON, though if the quotes are balanced and escaped, the Deser code should have just treated it as a string. Maybe there’s an issue with string escaping? Don’t know for sure, but will look into it.

If you can, would you please send a minimal repro project to my email : mcalsyn@pervasive.digital

If there’s a parser bug, I will post a PR with a fix to the GHI source repo.

2 Likes