使用Newtonsoft.Json序列化嵌套对象

g6ll5ycj  于 2023-03-04  发布在  其他
关注(0)|答案(1)|浏览(190)

我在思考如何正确序列化嵌套对象时遇到了麻烦。例如,假设我有下面的类,它描述了一个我想要序列化的对象。

public class MyObject
{
    [JsonProperty(PropertyName = "type")]
    public string Type { get; set; }

    [JsonProperty(PropertyName = "data")]
    public string Data { get; set; }

    [JsonConstructor]
    public MyObject()
    {
    }

    public MyObject(object obj)
    {
        Data = JsonConvert.SerializeObject(obj);
        Type = obj.GetType().FullName;
    }
}

在我的代码中,如果我想创建这个对象的一个新示例,我可以这样做:

static MyObject GetMyObject<T>(object goo)
{
    var v = (T)goo;
    MyObject obj = new MyObject();
    obj.Type = goo.GetType().FullName;
    obj.Data = JsonConvert.SerializeObject(v);
    return obj;
}

如果我只有一个对象,这一切都很好,但是我还需要序列化一个MyObject的列表,所以,我得到了这样的东西。

static MyObject GetMyObjectGroup(MyObjectGroup group)
{
    List<MyObject> children = new List<MyObject>();
    
    //Loop through the list of objects and serialize them
    foreach (var obj in group.Objects)
    {
        if (obj == null)
            continue;
        if (obj.GetType() == typeof(MyObjectGroup))
            return GetMyObjectGroup(obj as MyObjectGroup);
            
        MyObject child = new MyObject();
        child.Type = obj.GetType().FullName;
        child.Data = JsonConvert.SerializeObject(obj, GeometryResolver.Settings);
        children.Add(child);
    }

    //Now create a parent obj and set the data to the list of serialized children
    MyObject parent = new MyObject();
    parent.Type = group.GetType().FullName;
    parent.Data = JsonConvert.SerializeObject(children);
    return parent;
}

然而,当我尝试调用GetMyObjectGroup方法并查看结果时,json对象看起来并不正确,它似乎在序列化的子对象列表中到处都放置了大量的\"字符,例如,我的Json如下所示:

{
    "type": "MyObjectGroup",
    "data": "[{\"type\":\"SomeType\",\"data\":\"{\\\"version\\\":1000}},{\"type\":\"SomeType\",\"data\":\"{\\\"version\\\":2000}}]
}

当我认为它应该是这样阅读的时候:

{
    "type": "MyObjectGroup",
    "data": [
        {
            "type": "SomeType",
            "data": "{\"version\":1000}"
        },
        {
            "type": "SomeType",
            "data": "{\"version\":2000}"
        }
    ]
}
6ljaweal

6ljaweal1#

我测试了你的代码,一切正常,你只有一个bug,如果你想让你的方法递归,你必须把var children = new List<MyObject>()和父代码移到GetMyObjectGroup方法之外。
你可以让你的代码更简单

children.Add(GetMyObject<object>(obj));

    .... 

    var parent = GetMyObject<List<MyObject>>(children);

可以使用以下代码测试结果

string json = JsonConvert.SerializeObject(parent);

MyObject parent = JsonConvert.DeserializeObject<MyObject>(json);

List<MyObject> children = JsonConvert.DeserializeObject<List<MyObject>>(parent.Data);

相关问题