如何将数组反序列化为包装器对象?Json.NET是否需自定义转换器?
不需要自定义JsonConverter!用隐式转换就能搞定
你完全不用费劲写自定义Converter,Json.NET本身就支持利用隐式类型转换来处理这种场景——刚好你的ArrayWrapper已经定义了从int[]到自身的隐式转换,只需要简单调整代码就能让ArrayWrapper[] Array直接生效。
具体修改步骤:
- 删掉原来的
Array_和只读的Array属性 - 直接给
ArrayWrapper[] Array加上[JsonProperty("array")]特性,让它对应API返回的字段
修改后的完整代码如下:
public class Obj { [JsonProperty("array")] public ArrayWrapper[] Array { get; set; } // 现在可以直接反序列化了! } public struct ArrayWrapper { private readonly int[] array; public int Item0 => array[0]; public int Item1 => array[1]; public ArrayWrapper(int[] array) { this.array = array; } public static implicit operator ArrayWrapper(int[] array) { return new ArrayWrapper(array); } // 可选:如果需要把Obj序列化回JSON格式,添加反向隐式转换 public static implicit operator int[] (ArrayWrapper wrapper) { return wrapper.array; } }
为什么这能生效?
Json.NET在反序列化时,当需要将JSON中的int[]转换为ArrayWrapper类型时,会自动检测并调用你定义的隐式转换方法。对于数组来说,这个转换会被逐个应用到数组的每一项上,整个ArrayWrapper[]的反序列化过程就自动完成了。
如果之后你需要把Obj对象再序列化回符合API格式的JSON,只需要加上上面代码里的反向隐式转换,Json.NET同样会自动把ArrayWrapper转回int[],完美适配需求。
这种方式比自定义Converter简洁太多,完全利用了Json.NET内置的类型转换机制,不需要写额外的序列化/反序列化逻辑。
内容的提问来源于stack exchange,提问作者Denis535
相关产品推荐
相关产品推荐

