JSON解串器"失败" JSON值的最后一个属性

时间:2015-11-13 15:09:40

标签: c# json jsonserializer

传递像这样的Json值(这将是代码中的var jsonValue):

"{\"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\"}"

到以下代码:

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

类型是https://dotnetfiddle.net/LMPEl0的类型(谢谢克雷格)(对于奇怪的名字感到抱歉,不能透露实际的名字......)

jsonvalue是由DataTable的可编辑单元格中的输入生成的,并且显然将以前的空值放在json字符串的末尾。

我在" Something9"中得到一个空值。 returnValue中的属性,而不是8(Something9之前为null,并通过DataTable的可编辑单元格设置为8) Json值有问题我无法看到吗? 或者我需要在反序列化器中进行一些设置吗?

由于

2 个答案:

答案 0 :(得分:3)

您没有显示您的类型,因此我使用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; }
}

由于您的某个属性的名称无效,因此我将[JsonProperty]属性添加到该属性中。之后它完美地运作了。也许问题在于如何在.NET类型中声明@Delete JSON属性。鉴于Something9在该属性之后出现,我认为这是问题的一部分。

这是小提琴。

https://dotnetfiddle.net/McZF9Q

答案 1 :(得分:1)

虽然克雷格的回答有很多帮助,但最终得出了一个解决方案,问题的确切答案如下:

Status对象是Enum,未正确反序列化。 因此,Json字符串后面的任何内容也没有反序列化。

实现自定义Enum Deserializer是解决方案。 stackoverflow中还有其他问题对此有所帮助,尤其是这里的一个: How can I ignore unknown enum values during json deserialization?

谢谢大家:)