【问题标题】:JSON.NET Deserialization IssueJSON.NET 反序列化问题
【发布时间】:2013-09-06 22:41:00
【问题描述】:

我在使用 JSON.NET 反序列化某些数据时遇到问题。以下字符串虽然通过 JSON.NET 序列化,但不会正确反序列化。

{"ParentClause":null,"FilterClauseType":2,"FilterClause":[ {"FilterClauseType":1,"FilterClauses":[],"ComparisonType":2,"FieldStaticName":"ContentType","Value":"Hidden","FieldValueType":2}, {"FilterClauseType":1,"FilterClauses":[],"ComparisonType":1,"FieldStaticName":"ContentType","Value":"Document","FieldValueType":2}], "ComparisonType":null,"FieldStaticName":null,"Value":null,"FieldValueType":null}

执行JsonConvert.DeserializeObject() 会跳过FilterClauses 数组的元素,即使它们明显存在。无论我使用方法的泛型还是非泛型重载,都会发生这种情况。

这是一个错误,还是有什么方法可以解决这个问题?我尝试实现自定义JsonConverter,但传入的JReader 会引发异常。

作为参考,这是类定义:

class FilterClause 
{
    public FilterClause ParentClause {get; set;}
    public FilterClauseType FilterClauseType {get; set;}
    public IList<FilterClause> FilterClauses {get; set;}
    public ComparisonType? ComparisonType {get; set;}
    public String FieldStaticName {get; set;}
    public String Value {get; set;}
    public FieldValueType? FieldValueType {get; set;}

    public FilterClause()
    {
        FilterClauses = ImmutableList.Create<FilterClause>();
    }
}

【问题讨论】:

  • 您的构造函数似乎正在创建一个 ImmutableList。假设该实例实际上是不可变的,但仍实现了 IList,则反序列化器可能正在为每个项目调用 .Add,然后您的不可变列表类将忽略这些项目(因为如果不是,它就不是不可变的)。从构造函数中删除该行,然后重试。
  • 这没关系,因为即使我尝试反序列化为匿名对象(显然不会使用ImmutableList)时,它也不起作用

标签: c# .net json json.net


【解决方案1】:

试试这个

类定义

internal class SampleResponse1
{

    [JsonProperty("ParentClause")]
    public object ParentClause { get; set; }

    [JsonProperty("FilterClauseType")]
    public int FilterClauseType { get; set; }

    [JsonProperty("FilterClauses")]
    public FilterClaus[] FilterClauses { get; set; }

    [JsonProperty("ComparisonType")]
    public object ComparisonType { get; set; }

    [JsonProperty("FieldStaticName")]
    public object FieldStaticName { get; set; }

    [JsonProperty("Value")]
    public object Value { get; set; }

    [JsonProperty("FieldValueType")]
    public object FieldValueType { get; set; }
}

internal class FilterClaus
{

    [JsonProperty("FilterClauseType")]
    public int FilterClauseType { get; set; }

    [JsonProperty("FilterClauses")]
    public object[] FilterClauses { get; set; }

    [JsonProperty("ComparisonType")]
    public int ComparisonType { get; set; }

    [JsonProperty("FieldStaticName")]
    public string FieldStaticName { get; set; }

    [JsonProperty("Value")]
    public string Value { get; set; }

    [JsonProperty("FieldValueType")]
    public int FieldValueType { get; set; }
}

转换语法

var obj = JsonConvert.DeserializeObject<SampleResponse1>(Your_String);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2012-04-02
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多