C
C#2y ago
marsastro

✅ JsonConvert debugging help

Hello! I'm having a hard time figuring out how to solve an issue where JsonConvert.DeserializeObject is struggling to parse a weird data structure. Essentially I'm getting an object like this: {"powerup":{"on":{"on":{"on":true}}}} There are more objects and values, but I'm omitting them as they're not relevant to the parsing error In other words, an object called powerup with an object called on, that has an object called on, that has a bool called on. Very odd data structure, I know, but unfortunately this is what the API I'm consuming is giving me. A json converter tool suggested this:
public class Powerup
{
public On on { get; set; }
}

public class On
{
public bool on { get; set; }
}
public class Powerup
{
public On on { get; set; }
}

public class On
{
public bool on { get; set; }
}
However, this reads to a parsing error saying that { after the second on objects : is an unexpected character. Which makes sense, as it's expecting a bool, not an object. So I tried to fix it by doing this:
public class Powerup
{
public On on { get; set; }
}

public class On
{
public On2 on { get; set; }
}

public class On2
{
public bool on { get; set; }
}
public class Powerup
{
public On on { get; set; }
}

public class On
{
public On2 on { get; set; }
}

public class On2
{
public bool on { get; set; }
}
However, now I'm getting the error that it fails to convert a boolean value to the type On2, which seems to suggest that it's now suddenly reading it correctly as a bool and trying to set the On2 on variable with this bool value. I'm very confused at this point. Anyone have any idea what's going on here?
9 Replies
Angius
Angius2y ago
quictype.io generated the following:
namespace Parser
{
public class Root
{
[JsonPropertyName("powerup")]
public Powerup Powerup { get; set; }
}

public class Powerup
{
[JsonPropertyName("on")]
public PowerupOn On { get; set; }
}

public class PowerupOn
{
[JsonPropertyName("on")]
public OnOn On { get; set; }
}

public class OnOn
{
[JsonPropertyName("on")]
public bool On { get; set; }
}
}
namespace Parser
{
public class Root
{
[JsonPropertyName("powerup")]
public Powerup Powerup { get; set; }
}

public class Powerup
{
[JsonPropertyName("on")]
public PowerupOn On { get; set; }
}

public class PowerupOn
{
[JsonPropertyName("on")]
public OnOn On { get; set; }
}

public class OnOn
{
[JsonPropertyName("on")]
public bool On { get; set; }
}
}
see if it works Although it was generated for System.Text.Json, and you seem to be using Newtonsoft for some reason Just change JsonPropertyName to JsonProperty and it'll work with Newtonsoft
marsastro
marsastroOP2y ago
Gonna test it now, but that does seem very promising Got this: "Error converting value True to type 'namespace.OnOn'" Seems to be the same error as when I tried On2
MODiX
MODiX2y ago
Angius#1586
REPL Result: Success
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Globalization;

public partial class Root
{
[JsonPropertyName("powerup")]
public Powerup Powerup { get; set; }
}
public partial class Powerup
{
[JsonPropertyName("on")]
public PowerupOn On { get; set; }
}
public partial class PowerupOn
{
[JsonPropertyName("on")]
public OnOn On { get; set; }
}
public partial class OnOn
{
[JsonPropertyName("on")]
public bool On { get; set; }
}

var json = """
{
"powerup":
{
"on":
{
"on":
{
"on": true
}
}
}
}
""";

var data = JsonSerializer.Deserialize<Root>(json);
data
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Globalization;

public partial class Root
{
[JsonPropertyName("powerup")]
public Powerup Powerup { get; set; }
}
public partial class Powerup
{
[JsonPropertyName("on")]
public PowerupOn On { get; set; }
}
public partial class PowerupOn
{
[JsonPropertyName("on")]
public OnOn On { get; set; }
}
public partial class OnOn
{
[JsonPropertyName("on")]
public bool On { get; set; }
}

var json = """
{
"powerup":
{
"on":
{
"on":
{
"on": true
}
}
}
}
""";

var data = JsonSerializer.Deserialize<Root>(json);
data
Result: Root
{
"powerup": {
"on": {
"on": {
"on": true
}
}
}
}
{
"powerup": {
"on": {
"on": {
"on": true
}
}
}
}
Compile: 578.397ms | Execution: 60.214ms | React with ❌ to remove this embed.
Angius
Angius2y ago
Seems to be working At least with STJ
marsastro
marsastroOP2y ago
Hmm, maybe I'll give it a shot with STJ instead then. Didn't pick newtonsoft for any particular reason, it was just the first option I found
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
MODiX
MODiX2y ago
Angius#1586
Just change JsonPropertyName to JsonProperty and it'll work with Newtonsoft
Quoted by
<@!85903769203642368> from #JsonConvert debugging help (click here)
React with ❌ to remove this embed.
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
marsastro
marsastroOP2y ago
There, finally got it to work. Ended up with some new issues, but that was just quicktype interpreting float values as long. STJ did the trick I'll make sure I avoid newtonsoft in the future, thanks for the help!
Want results from more Discord servers?
Add your server