title: How to handle error in Json.Net parsing
body: <p>I'm using Json.Net for Json deserialization. On occasion the Json string I read is not correct (which I can't fix since I don't produce it). In particular, at one specific place, where there should be a string, sometimes there is a serialized object instead. Json.Net then complains, not surprisingly,  about finding an object where it expected a string.</p>
  
  <p>I found I can intercept this by using <code>Error</code> in <code>JsonSerializerSettings</code> and also make Json.Net ignore the problem by setting <code>ErrorContext.Handled</code>. But I want to do even more. If I could look at the serialised object I could figure out what the string should be and in theory supply the correct answer. In practice I can't figure our how to do so. Especially, in the error handler:</p>
  
  <ul>
  <li>How do I access the string that the parser tripped up on (Note that the parser can successfully continue if <code>ErrorContext.Handled</code> is set, so it can determine start and end of the problem string correctly)?</li>
  <li>How do I supply the correct string back to the parser, or alternatively get access to the currently parsed object so I can set the value manually?</li>
  </ul>
  
  <p>[Edit] 
  As requested a simplified example:</p>
  
  <p>The incorrect Json string I get to parse:</p>
  
  <pre><code>{
      "id": 2623,
      "name": {
          "a": 39,
          "b": 0.49053320637463277,
          "c": "cai5z+A=",
          "name": "22"
      },
      "children": [
          {
              "id": 3742,
              "name": {
                  "a": 37,
                  "b": 0.19319664789046936,
                  "c": "Me/KKPY=",
                  "name": "50"
              },
              "children": [
                  {
                      "id": 1551,
                      "name": {
                          "a": 47,
                          "b": 0.6935373953047849,
                          "c": "qkGkMwY=",
                          "name": "9"
                      },
                      "children": []
                  },
                  {
                      "id": 4087,
                      "name": {
                          "a": 5,
                          "b": 0.42905938319352427,
                          "c": "VQ+yH6o=",
                          "name": "84"
                      },
                      "children": []
                  },
                  {
                      "id": 614,
                      "name": {
                          "a": 19,
                          "b": 0.7610801005554758,
                          "c": "czjTK1s=",
                          "name": "11"
                      },
                      "children": []
                  }
              ]
          },
          {
              "id": 3382,
              "name": {
                  "a": 9,
                  "b": 0.36416331043660793,
                  "c": "lnoHrd0=",
                  "name": "59"
              },
              "children": [
                  {
                      "id": 4354,
                      "name": {
                          "a": 17,
                          "b": 0.8741648112769075,
                          "c": "CD2i2I0=",
                          "name": "24"
                      },
                      "children": []
                  },
                  {
                      "id": 2533,
                      "name": {
                          "a": 52,
                          "b": 0.8839575992356788,
                          "c": "BxFEzVI=",
                          "name": "60"
                      },
                      "children": []
                  },
                  {
                      "id": 5733,
                      "name": {
                          "a": 4,
                          "b": 0.7230552787534219,
                          "c": "Un7lJGM=",
                          "name": "30"
                      },
                      "children": []
                  }
              ]
          },
          {
              "id": 9614,
              "name": {
                  "a": 81,
                  "b": 0.4015882813379114,
                  "c": "dKgyRZk=",
                  "name": "63"
              },
              "children": [
                  {
                      "id": 7831,
                      "name": {
                          "a": 81,
                          "b": 0.2784254314743101,
                          "c": "xZur64o=",
                          "name": "94"
                      },
                      "children": []
                  },
                  {
                      "id": 6293,
                      "name": {
                          "a": 73,
                          "b": 0.32629523068959604,
                          "c": "lMkosP4=",
                          "name": "93"
                      },
                      "children": []
                  },
                  {
                      "id": 5253,
                      "name": {
                          "a": 13,
                          "b": 0.19240453242901923,
                          "c": "oOPZ3tA=",
                          "name": "5"
                      },
                      "children": []
                  }
              ]
          }
      ]
  }
  </code></pre>
  
  <p>And here to class to parse it into:</p>
  
  <pre><code>class Node
  {
       [JsonProperty]
      int id;
       [JsonProperty]
      string name;
       [JsonProperty]
      List&lt;Node&gt; children;
  }
  </code></pre>
  
  <p>As you can see it expects a string <code>name</code> but sometimes incorrectly gets a serialised object (which contains the string in question as a member). This only happens in some JSON strings but not others, so I can't just change the class definition of Node to match.</p>
  
  <p>[Edit 2] 
  A "correct" Json string according to my API would look like this:</p>
  
  <pre><code>{
      "id": 2623,
      "name": "22",
      "children": [
          {
              "id": 3742,
              "name": "50",
              "children": [
                  {
                      "id": 1551,
                      "name": "9",
                      "children": []
                  },
                  {
                      "id": 4087,
                      "name":"84",
                      "children": []
                  },
                  ...
  </code></pre>