传递像这样的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值有问题我无法看到吗? 或者我需要在反序列化器中进行一些设置吗?
由于
答案 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
在该属性之后出现,我认为这是问题的一部分。
这是小提琴。
答案 1 :(得分:1)
虽然克雷格的回答有很多帮助,但最终得出了一个解决方案,问题的确切答案如下:
Status对象是Enum,未正确反序列化。 因此,Json字符串后面的任何内容也没有反序列化。
实现自定义Enum Deserializer是解决方案。 stackoverflow中还有其他问题对此有所帮助,尤其是这里的一个: How can I ignore unknown enum values during json deserialization?
谢谢大家:)