如何使用JSON.NET自定义引用解析

Mic*_*eth 10 c# json json.net

我有以下JSON:

{
           "id" : "2"
   "categoryId" : "35"
         "type" : "item"
         "name" : "hamburger"
}
{
           "id" : "35"
         "type" : "category"
         "name" : "drinks" 
}
Run Code Online (Sandbox Code Playgroud)

我想将它与此对象匹配:

public class Item 
{
  [JsonProperty(PropertyName = "categoryId")]
  public Category Category { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

CategoryEntity具有string Id我可以访问的属性的类型.我希望JSON反序列化器创建的"35"对象映射到该Category属性中Item.

根据文档,我应该使用IReferenceResolver.我如何实现此接口并将其挂钩到JSON.NET框架中?

小智 12

您可以在JsonSerializerSettings中指定自定义IRefenceResover:

JsonSerializerSettings settings = new JsonSerializerSettings ();
settings.ReferenceResolver = new IDReferenceResolver ();
Run Code Online (Sandbox Code Playgroud)

对于具有Guid id属性的对象,有一个很好的IDReferenceResolver实现示例.引用字符串现在是对象的id,它类似于您的用例,除了您的id属性使用int而不是Guid类型.

using System;
using System.Collections.Generic;
using Newtonsoft.Json.Serialization;

   namespace Newtonsoft.Json.Tests.TestObjects
   {
    public class IdReferenceResolver : IReferenceResolver
    {
        private readonly IDictionary<Guid, PersonReference> _people = new Dictionary<Guid, PersonReference>();

        public object ResolveReference(object context, string reference)
        {
            Guid id = new Guid(reference);

            PersonReference p;
            _people.TryGetValue(id, out p);

            return p;
        }

        public string GetReference(object context, object value)
        {
            PersonReference p = (PersonReference)value;
            _people[p.Id] = p;

            return p.Id.ToString();
        }

        public bool IsReferenced(object context, object value)
        {
            PersonReference p = (PersonReference)value;

            return _people.ContainsKey(p.Id);
        }

        public void AddReference(object context, string reference, object value)
        {
            Guid id = new Guid(reference);

            _people[id] = (PersonReference)value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)