JSON 解串器 "loses" JSON 值的最后 属性
JSON Deserializer "loses" last property of JSON value
像这样传递一个 Json 值(这将是代码中的 var json 值):
"{\"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);
type 是 https://dotnetfiddle.net/LMPEl0 的类型(谢谢你 Craig)(抱歉奇怪的名字,不能透露实际的...)
json值由 DataTable 的可编辑单元格中的输入生成,显然将以前的空值放在 json 字符串的末尾。
我在 "Something9" 属性 的 returnValue 中得到一个空值,而不是 8(Something9 之前是空的,通过 DataTable 的可编辑单元格设置为 8)
我看不到的 Json 值有问题吗?
或者我需要在解串器中进行一些设置吗?
谢谢
你没有显示你的类型,所以我使用 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; }
}
因为您的一个属性的名称作为 .NET 无效 属性 我向该属性添加了 [JsonProperty]
属性。在那之后它完美地工作了。也许问题在于您如何在 .NET 类型中声明 @Delete
JSON 属性。鉴于 Something9
在 之后 而 属性 我猜这是问题的一部分。
这是 fiddle。
虽然 Craig 的回答很有帮助并最终找到了解决方案,但问题的确切答案如下:
Status 对象是一个枚举对象,未正确反序列化。
因此,Json 字符串中的任何内容也未反序列化。
实现自定义枚举解串器是解决方案。 Whosebug 中还有其他问题对此有所帮助,尤其是这里的这个问题:
How can I ignore unknown enum values during json deserialization?
谢谢大家:)
像这样传递一个 Json 值(这将是代码中的 var json 值):
"{\"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);
type 是 https://dotnetfiddle.net/LMPEl0 的类型(谢谢你 Craig)(抱歉奇怪的名字,不能透露实际的...)
json值由 DataTable 的可编辑单元格中的输入生成,显然将以前的空值放在 json 字符串的末尾。
我在 "Something9" 属性 的 returnValue 中得到一个空值,而不是 8(Something9 之前是空的,通过 DataTable 的可编辑单元格设置为 8) 我看不到的 Json 值有问题吗? 或者我需要在解串器中进行一些设置吗?
谢谢
你没有显示你的类型,所以我使用 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; }
}
因为您的一个属性的名称作为 .NET 无效 属性 我向该属性添加了 [JsonProperty]
属性。在那之后它完美地工作了。也许问题在于您如何在 .NET 类型中声明 @Delete
JSON 属性。鉴于 Something9
在 之后 而 属性 我猜这是问题的一部分。
这是 fiddle。
虽然 Craig 的回答很有帮助并最终找到了解决方案,但问题的确切答案如下:
Status 对象是一个枚举对象,未正确反序列化。 因此,Json 字符串中的任何内容也未反序列化。
实现自定义枚举解串器是解决方案。 Whosebug 中还有其他问题对此有所帮助,尤其是这里的这个问题: How can I ignore unknown enum values during json deserialization?
谢谢大家:)