【问题标题】:JSON Deserializer "loses" last property of JSON valueJSON 反序列化器“丢失”JSON 值的最后一个属性
【发布时间】:2015-11-13 15:09:40
【问题描述】:

传递一个像这样的 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);

type 是 https://dotnetfiddle.net/LMPEl0 的类型(谢谢 Craig)(对不起,奇怪的名字,不能透露实际的名字......)

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

我在 returnValue 的“Something9”属性中得到一个空值,而不是 8(Something9 之前为空,并通过 DataTable 的可编辑单元格设置为 8) 我看不到的 Json 值是否存在问题? 还是我需要在 Deserializer 中进行一些设置?

谢谢

【问题讨论】:

  • Something9 包含字符串,也许您的班级将 Something9 作为 Integer 并且它不解析它..?
  • 确实是类中的整数。我应该将输入更改为您认为的整数吗?
  • 你的代码 sn-p 中的“类型”是什么?
  • @DimitrisG。 - 是的,在代码或 json 中更改它。
  • 抱歉,本例中的类型是 {Name = "PositionDto" FullName = "MyProject.Contracts.Data.Events.PositionDto"} 另外一个重要的注意事项是,Something9 作为属性通常在 " Something2”,但由于某种原因,当创建 json 对象时,它被放在最后,这可能会导致问题。我会将此信息添加到问题中。也谢谢大家的快速解答!

标签: c# json jsonserializer


【解决方案1】:

你没有显示你的类型,所以我使用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 出现在该属性之后,我猜这是问题的一部分。

这是小提琴。

https://dotnetfiddle.net/McZF9Q

【讨论】:

  • 你好,克雷格。谢谢你的回答。除了在“Something2”之后的“Something9”之外,该类型就像你在小提琴中拥有它一样。但是,当生成 json 值时,它被放置在字符串的末尾(因为它之前有一个空值?)。 “Something9”也是一个公共整数?并获取在 DataTable 的可编辑单元格中传递的新值。
  • 另外,@Delete 属性是表的删除列,并像在 json 字符串中那样传递。我可能应该提到,当 Something9 的​​值之前不为空并发生变化时,不会出现问题。
  • 好吧,我终于找到了问题,虽然你的回答没有直接解决问题,但它对正确的方向有很大帮助,所以我会接受它是正确的。对于历史,问题在于 Status 对象,它实际上是一个 Enum 并且没有正确反序列化(我必须为 Enums 实现一个自定义反序列化器),因此“销毁”它之后的 json 字符串中的任何属性。
【解决方案2】:

虽然克雷格的回答很有帮助并最终导致了解决方案,但该问题的确切答案如下:

Status 对象是一个枚举并且没有正确反序列化。 因此,Json 字符串中的任何内容也没有被反序列化。

实施自定义枚举反序列化器是解决方案。 stackoverflow 中还有其他问题对此有所帮助,尤其是这里的问题: How can I ignore unknown enum values during json deserialization?

谢谢大家:)

【讨论】:

  • 您可以接受自己的答案,这将帮助人们更快地找到解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多