禁用单个外部类型的JSON.Net PreserveReferencesHandling

时间:2017-06-13 08:13:03

标签: c# serialization json.net

我遇到的问题是外部资源不接受生成的JSON中的$ id和$ ref属性。但是我们内部需要这个,我不能只是全局禁用PreserveReferencesHandling。

如何为单一类型禁用此功能?我已经看到了[JsonObject]属性,但由于这个类来自外部源,我无法将属性添加到它... 我查看了IContractResolver,但无法弄清楚如何禁用那里的引用处理。

谢谢!

  • JSON.Net v10.0.2

1 个答案:

答案 0 :(得分:1)

这可以通过覆盖custom ContractResolver设置JsonContract.IsReference == falseDefaultContractResolver.CreateContract()来完成:

ContainsType()

应该为构造函数传递要禁用其参考信息的类型列表。请注意,我将此信息排除在传递给合同解析程序的确切类型的实例中。如果您还要从派生类型的实例中排除此信息,可以按如下方式修改 bool ContainsType(Type type) { return types.Any(t => t.IsAssignableFrom(type)); }

JsonSerializerSettings

另请注意,合约解析程序在const search = R.curry((id, items) => R.find(R.propEq('id', id), items)); const testSearch = R.pipe( R.identity(() => [{id: '123'}, {id: 'asdf'}]), search('123') ); testSearch(); // { id: '123' } 中设置时会禁用PreserveReferencesHandling,但在使用[JsonObject(IsReference = true)]或{{3}等序列化属性直接设置时不会在外部类型上。

示例[JsonProperty(IsReference = true)]

您可能希望fiddle获得最佳效果。