c# – 用Json.Net反序列化,将子对象反序列化为字符串类似的持有json?

c# – 用Json.Net反序列化,将子对象反序列化为字符串类似的持有json?,第1张

概述我正在尝试使用Json创建配置文件,该文件将保存各种类型对象的配置. 考虑这个文件: { "cameras": [ { "type": "Some.Namespace.CameraClass", "assembly": "Some.Assembly", "configuration": { 我正在尝试使用Json创建配置文件,该文件将保存各种类型对象的配置.

考虑这个文件:

{    "cameras": [        {            "type": "Some.namespace.CameraClass","assembly": "Some.Assembly","configuration": {                "ip": "127.0.0.1","port": 8080            }        }    ]}

在运行时,我将使用两个“类型”和“程序集”属性来构造支持特定接口的对象,然后我想将配置加载到该对象中.

但是,在编译时我不知道“配置”将映射到的类型.我想将它保留为Json“属性”并将其提供给相机对象,然后让该对象将Json反序列化为正确的类型.

因此,我想将包含特定相机类型配置的配置文件的一部分“随身携带”到对象本身,然后让它处理它,像我一样把它当作黑盒子处理它.应该保留该部分的结构,因为在为每个摄像机实现创建配置类型时我想要完全保真,甚至在必要时添加子对象.

对于这个特定的相机,我会配置一个IP地址和一个端口,对于其他一些相机我需要授权数据,而对于其他一些相机则完全不同.

我希望保持这种配置的属性能够直接获取Json,仍然是一个字符串.

这可能吗?

这是一个有一些位注释掉的LINQPad示例:

voID Main(){    const string configurationfile = @"[    {        ""type"": ""Userquery+Camera1"",""configuration"": { ""ID"": 10 }    },{        ""type"": ""Userquery+Camera2"",""configuration"": { ""name"": ""The second camera"" }    }]";    var cameras = JsonConvert.DeserializeObject<Camera[]>(configurationfile);    foreach (var camera in cameras)    {        var type = Type.GetType(camera.Type);        var instance = Activator.CreateInstance(type,new object[0]) as ICamera;        // instance.Configure(camera.Configuration);    }}public class Camera{    public string Type { get; set; }    public JObject Configuration { get; set; }}public interface ICamera{    voID Configure(string Json);}public class Camera1 : ICamera{    private class Configuration    {        public int ID { get; set; }    }    public voID Configure(string Json)    {        JsonConvert.DeserializeObject<Configuration>(Json).Dump();    }}public class Camera2 : ICamera{    private class Configuration    {        public string name { get; set; }    }    public voID Configure(string Json)    {        JsonConvert.DeserializeObject<Configuration>(Json).Dump();    }}

两个注释掉的位,即Camera类中的属性,以及对Configure方法的调用,都是我想要的.

有什么东西我可以标记该属性,或者我可以为该属性选择的其他类型,这将使​​这工作吗?

我知道我可以使属性动态化,这会将JObject填入其中,但是每个相机实现的每个Configure方法都必须处理JObject而不是已知的非动态类型.

解决方法 看起来如果你使用JObject类型的属性,它会解析但保留JsON:
using System;using System.IO;using Newtonsoft.Json;using Newtonsoft.Json.linq;    public class Foo{    public string name { get; set; }    public int Age { get; set; }    public JObject Configuration { get; set; }}public class Test{   public static voID Main()   {       var Json = file.ReadAllText("test.Json");       var foo = JsonConvert.DeserializeObject<Foo>(Json);       Console.Writeline(foo.Configuration);   }}

Test.Json:

{  "name": "Jon","age": 10,"configuration": {    "ip": "127.0.0.1","port": 8080  }}

输出:

{  "ip": "127.0.0.1","port": 8080}

我怀疑你可以直接从JObject反序列化,但如果你真的想,你总是可以将它转换回字符串.

总结

以上是内存溢出为你收集整理的c# – 用Json.Net反序列化,将子对象反序列化为字符串/类似的持有json?全部内容,希望文章能够帮你解决c# – 用Json.Net反序列化,将子对象反序列化为字符串/类似的持有json?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1247751.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存