2

所以我试图反序列化一个具有属性的对象:$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
    }
}
4

3 回答 3

4

尝试反序列化 swagger/json 模式文档时,我遇到了同样的问题。解决方案是:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
于 2015-04-30T00:03:06.523 回答
2

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

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

尝试更改键。

于 2011-01-17T02:56:24.087 回答
0

这个答案对我有用:Json.Net 将 $id 添加到 EF 对象,尽管将 PreserveReferencesHandling 设置为“无”

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

public override JsonContract ResolveContract(Type type) {
    var contract = base.ResolveContract(type);
    contract.IsReference = false;
    return contract;
}
于 2014-02-09T13:45:48.900 回答