gpt4 book ai didi

c# - 使用 Json.Net 反序列化,将子对象反序列化为包含 json 的字符串/类似字符串?

转载 作者:太空狗 更新时间:2023-10-29 20:16:42 25 4
gpt4 key购买 nike

我正在尝试使用 Json 创建一个配置文件,它将保存各种类型对象的配置。

考虑这个文件:

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

在运行时,我将使用“type”和“assembly”这两个属性来构造一个支持特定接口(interface)的对象,然后我想将配置加载到该对象中。

但是,在编译时我不知道“配置”将映射到的类型。我想将其保留为 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);
}

}

测试.json:

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

输出:

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

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

关于c# - 使用 Json.Net 反序列化,将子对象反序列化为包含 json 的字符串/类似字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com