【问题标题】:Deserializing $ref and $id反序列化 $ref 和 $id
【发布时间】:2010-03-07 19:03:07
【问题描述】:

所以我试图反序列化一个具有以下属性的对象:$ref 和 $id。我尝试在字典和我通过 JsonPropertyAttribute 指定命名约定的对象之间切换。 序列化有效,但反序列化无效。我不断收到的错误是:

在 JSON 字符串中发现的附加文本 完成反序列化对象后。

三个示例均失败的示例代码。

[Serializable]
public class Ref
{
    [JsonProperty(PropertyName = "$ref")]
    public virtual string RefName { get; set; }
    [JsonProperty(PropertyName = "$id")]
    public virtual int Id { get; set; }
}

[Serializable]
public class Child
{
    public virtual string Name { get; set; }
    [JsonProperty(IsReference = true)]
    public virtual Ref Father { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        //Additional text found in JSON string after finishing deserializing object.
        //Test 1
        var reference = new Dictionary<string, object>();
        reference.Add("$ref", "Persons");
        reference.Add("$id", 1);

        var child = new Dictionary<string, object>();
        child.Add("_id", 2);
        child.Add("Name", "Isabell");
        child.Add("Father", reference);

        var json = JsonConvert.SerializeObject(child);
        var obj = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); //Exception

        //Test 2
        var refOrg = new Ref {RefName = "Parents", Id = 1};
        var refSer = JsonConvert.SerializeObject(refOrg);
        var refDeser = JsonConvert.DeserializeObject<Ref>(refSer); //Exception

        //Test 3
        var childOrg = new Child {Father = refOrg, Name = "Isabell"};
        var childSer = JsonConvert.SerializeObject(childOrg);
        var childDeser = JsonConvert.DeserializeObject<Child>(refSer); //Exception
    }
}

【问题讨论】:

    标签: json serialization json.net


    【解决方案1】:

    我在尝试反序列化 swagger/json 架构文档时遇到了同样的问题。解决办法是:

    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
    

    【讨论】:

      【解决方案2】:

      您会发现 $ref$id 是 Json.NET 用来管理单个对象图中的多个对象实例的特殊属性。

      通过将这些键放入您的字典中,反序列化过程会尝试将这些键解析为对不存在的对象的引用。

      尝试更改键。

      【讨论】:

        【解决方案3】:

        这个答案对我有用:Json.Net adding $id to EF objects despite setting PreserveReferencesHandling to "None"

        在您的 DefaultContractResolver/IContractResolver 实现中,添加这个;

        public override JsonContract ResolveContract(Type type) {
            var contract = base.ResolveContract(type);
            contract.IsReference = false;
            return contract;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-12-26
          • 1970-01-01
          • 2014-01-29
          • 2012-03-17
          • 1970-01-01
          • 2013-04-19
          相关资源
          最近更新 更多