I'm trying to parse a string to JSON, and it works if I parse it to JObject
, but if I try to parse to my own custom type, I'm getting an error when it tries to parse the Properties
property
error: Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: {. Path 'Properties', line 1, position 212.'
var str2 = "{\"Timestamp\":\"2024-02-15T12:55:03.9797576+02:00\",\"Level\":\"Information\",\"MessageTemplate\":\"User profile is available. Using '{FullName}' as key repository and Windows DPAPI to encrypt keys at rest.\",\"Properties\":{\"FullName\":\"C:\\\\Users\\\\Buga\\\\AppData\\\\Local\\\\ASP.NET\\\\DataProtection-Keys\",\"EventId\":{\"Id\":63,\"Name\":\"UsingProfileAsKeyRepositoryWithDPAPI\"},\"SourceContext\":\"Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager\"}}";
var obj = JsonConvert.DeserializeObject<JObject>(str2); // this works
var obj2 = JsonConvert.DeserializeObject<LogItem>(str2); // error here
public class LogItem
{
public DateTimeOffset Timestamp { get; set; }
public string Level { get; set; }
public string MessageTemplate { get; set; }
public string Properties { get; set; }
public string SourceContext { get; set; }
}
You have string Properties
, so it is expecting something like:
"Properties": "foo"
but the JSON has an object:
"Properties":{"FullName": ... }
So, one of:
Properties
type to be a suitable objectThe model must match the data.
Something like:
public class LogItem
{
public DateTimeOffset Timestamp { get; set; }
public string Level { get; set; }
public string MessageTemplate { get; set; }
public LogItemProperties Properties { get; set; }
public string SourceContext { get; set; }
}
public class LogItemProperties
{
public LogEventId EventId { get; set; }
public string FullName { get; set; }
}
public class LogEventId
{
public long Id { get; set; }
public string Name { get; set; }
}
As an aside: prefer "raw strings" for handling JSON literals (and XML literals, etc):
var str2 = """{"Timestamp":"2024-02-15T12:55:03.9797576+02:00","Level":"Information","MessageTemplate":"User profile is available. Using '{FullName}' as key repository and Windows DPAPI to encrypt keys at rest.","Properties":{"FullName":"C:\\Users\\Buga\\AppData\\Local\\ASP.NET\\DataProtection-Keys","EventId":{"Id":63,"Name":"UsingProfileAsKeyRepositoryWithDPAPI"},"SourceContext":"Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager"}}""";
or formatted, if you prefer (although this changes the string
value:
var str2 = """
{
"Timestamp":"2024-02-15T12:55:03.9797576+02:00",
"Level":"Information",
"MessageTemplate":"User profile is available. Using '{FullName}' as key repository and Windows DPAPI to encrypt keys at rest.",
"Properties":{
"FullName":"C:\\Users\\Buga\\AppData\\Local\\ASP.NET\\DataProtection-Keys",
"EventId":{
"Id":63,
"Name":"UsingProfileAsKeyRepositoryWithDPAPI"
},
"SourceContext":"Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager"
}
}
""";