【问题标题】:Deserialize Json into member class of a class将Json反序列化为类的成员类
【发布时间】:2022-08-21 23:11:57
【问题描述】:

我有以下 Json sn-p:

{
  \"lastUpdated\": \"2020-08-10T02:59:18+00:00\",
  \"providerName\": \"Some Provider\",
  \"language\": \"en-US\",
  \"movies\": [
    {
    }
   ]
}

这些提议的类定义:

[Serializable]

    public class JfoRoot
    {
        public JfoRoot()
        {
        }
    
        public string lastUpdated { get; set; }

        public string providerName { get; set; }

        public string language { get; set; }

    }

[Serializable]
    public class JsonFeedObject
    {        
        public JsonFeedObject()
        {
        }
        
        public JfoRoot jforoot { get; set; }
        
        public MovieObject[] movies { get; set; }
    }    

我想反序列化 Json 使用:

jfo = JsonConvert.DeserializeObject<JsonFeedObject>(File.ReadAllText(path), jsonSerializerSettings);

使用上述方法,我想将前三个 Json 字段反序列化到 JfoRoot 类中。我尝试使用几种方法,包括使用 [JsonConstructor] 并在阅读帖子 Using Newtonsoft.Json with nested custom classes. 后提供 JsonConverter

没有任何效果。在我每次尝试之后,JfoRoot 类都是 \'null\'。我觉得我错过了一些明显的东西。或者,也许这无法完成。如果这可能的话,有人可以解释一下吗?

  • 您所说的“没有任何效果”是什么意思?怎么没用?如果创建JsonConverter 并将其应用于JsonFeedObject 类中的jforoot 属性,则可以在JsonConverter 中实例化对象并设置所需的属性。
  • 投反对票……?

标签: c# json json-deserialization


【解决方案1】:

您尝试从 JSON 中具体化的对象与 JSON 对象不匹配。如果您将所有属性从JfoRoot 移动到JsonFeedObject,那么这将正确反序列化

public class JsonFeedObject
{
    public JsonFeedObject()
    {
    }

    public string lastUpdated { get; set; } = default!;

    public string providerName { get; set; } = default!;

    public string language { get; set; } = default!;

    public MovieObject[] movies { get; set; } = default!;
}

然后打电话

var json = File.ReadAllText(path);
var result = JsonConvert.DeserializeObject<JsonFeedObject>(json);

结果是

[14:52:39 INF] {"lastUpdated": "2020-08-10T02:59:18+00:00", "providerName": "Some Provider", "language": "en-US", "movies": [{"$type": "MovieObject"}], "$type": "JsonFeedObject"}

要将它们反序列化为子对象,我必须添加具有特定属性的构造函数

public class JfoRoot
{
    public JfoRoot()
    {
    }

    public string lastUpdated { get; set; } = default!;

    public string providerName { get; set; } = default!;

    public string language { get; set; } = default!;
}

public class JsonFeedObject
{
    public JsonFeedObject(string lastUpdated, string providerName, string language, MovieObject[] movies)
    {
        this.jfoRoot = new JfoRoot
        {
            lastUpdated = lastUpdated, 
            providerName = providerName, 
            language = language
        };

        this.movies = movies;
    }

    public JfoRoot jfoRoot { get; set; } = default!;

    public MovieObject[] movies { get; set; } = default!;
}
var json = File.ReadAllText(path);
var result = JsonConvert.DeserializeObject<JsonFeedObject>(json);

导致

[15:21:15 INF] {"jfoRoot": {"lastUpdated": "2020-08-10T02:59:18+00:00", "providerName": "Some Provider", "language": "en-US", "$type": "JfoRoot"}, "movies": [{"$type": "MovieObject"}], "$type": "JsonFeedObject"}

【讨论】:

  • 将这些属性移动到基类不符合 OP 唯一提到的要求,即:“使用上述方法,我想将前三个 Json 字段反序列化到 JfoRoot 类中。”.
  • @wwd 我知道将这些字段移到基类中是可行的。事实上,这就是我最初的编码方式。但是,我现在有一个新的要求,将它分成一个额外的类。
  • 给我一分钟。
【解决方案2】:

我能够通过重新设计我使用的类来解决这个问题。而不是使用:

[Serializable]
    public class JsonFeedObject
    {        
        public JsonFeedObject()
        {
        }
        
        public JfoRoot jforoot { get; set; }
        
        public MovieObject[] movies { get; set; }
    }    

我切换到:

public class JsonFeedObject : JfoRoot

这是一个如此简单的更改,它可以提供所有反序列化的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多