jimmious
jimmious

Reputation: 368

JSON Deserializer "loses" last property of JSON value

passing a Json value like this one(this will be the var jsonValue in code):

"{\"Something\":0,\"Something2\":10,\"Something3\":{\"Something4\":17,\"Something5\":38042,\"Something6\":38043,\"Id\":215},\"Something7\":215,\"SomethingId\":42,\"Something8\":\"AString, Gläser\",\"Something8\":\"44-55-18\",\"Status\":{\"Caption\":\"Fixed\",\"Value\":7},\"Type\":\"Article\",\"Id\":97,\"@Delete\":true,\"Something9\":\"8\"}"

to the following code:

var deserializer = new JsonSerializer();
const string regex = @"/Date\((.*?)\+(.*?)\)/";
var reader = new JsonTextReader(new StringReader(jsonValue));
returnValue = deserializer.Deserialize(reader, type);

type is the typeof https://dotnetfiddle.net/LMPEl0 (thank you Craig) (sorry for the weird names, can't disclose the actual ones...)

The jsonvalue is generated by input in an editable cell of a DataTable and apparently places previously null values in the end of the json string.

I get a null value in the "Something9" property in the returnValue, instead of 8(Something9 was null before and set to 8 through an editable Cell of a DataTable) Is there some problem with the Json value that I can't see? Or do I need some setting in the Deserializer?

Thanks

Upvotes: 0

Views: 714

Answers (2)

jimmious
jimmious

Reputation: 368

While Craig's answer helped a lot and finally led to a solution the exact answer to the problem was the following:

The Status object is an Enum and was not Deserialized correctly. Due to that, anything that followed in the Json string was also not deserialized.

Implementing a custom Enum Deserializer was the solution. There are other Questions in stackoverflow that helped with this, particularly this one here: How can I ignore unknown enum values during json deserialization?

Thank you everyone :)

Upvotes: 1

Craig W.
Craig W.

Reputation: 18165

You don't show what your type is so I generated one using http://json2csharp.com.

public class Something3
{
    public int Something4 { get; set; }
    public int Something5 { get; set; }
    public int Something6 { get; set; }
    public int Id { get; set; }
}

public class Status
{
    public string Caption { get; set; }
    public int Value { get; set; }
}

public class RootObject
{
    public int Something { get; set; }
    public int Something2 { get; set; }
    public Something3 Something3 { get; set; }
    public int Something7 { get; set; }
    public int SomethingId { get; set; }
    public string Something8 { get; set; }
    public Status Status { get; set; }
    public string Type { get; set; }
    public int Id { get; set; }
    [JsonProperty("@Delete")]
    public bool Delete { get; set; }
    public string Something9 { get; set; }
}

Because one of your properties has a name that is not valid as a .NET property I added the [JsonProperty] attribute to that one. After that it worked perfectly. Perhaps the problem is with how you declared the @Delete JSON property in your .NET type. Given that Something9 comes after that property it would be my guess that that's part of the problem.

Here's the fiddle.

https://dotnetfiddle.net/McZF9Q

Upvotes: 3

Related Questions