【问题标题】:How to Deserialize an JSON object with invalid field name in it如何反序列化包含无效字段名称的 JSON 对象
【发布时间】:2012-08-31 12:15:16
【问题描述】:

我有一个 JSON 请求,其结构如下:

"formats":  {
        "flash_embed": "http://a3.vikiassets.com/assets/vikiplayer-922746a667cfd38137a7e45df6ba1b95.swf?auto_play=true&language_codes=en&media_id=74965&partner=16&source=api_v3",
        "m3u8": "http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965/ios.m3u8",
        "res-150p": "http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_mp4cell_150.mp4",
        "res-240p": "http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_240p.mp4",
        "res-270p": "http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_270p.mp4",
        "res-360p": "http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_360p.mp4",
        "res-480p": "http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_480p.mp4",
        "res-720p": "http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_720p.mp4"
      }
    }

现在 res-150p,在 C# 中表示无效名称,如果我给它取另一个名称,那么在进行理想化时我没有得到任何值,这在 res-150p 中为 null。

编辑: [可序列化] MoviesListRootObject 是包含Response 然后Response 包含Formats 的根对象

public class MoviesListRootObject
{
    public int count { get; set; }
    public Pagination pagination { get; set; }
    public List<Response> response { get; set; }
}

[Serializable]
public class Response
{
    public int id { get; set; }
    public int channel_id { get; set; }
    public string title { get; set; }
    public string title_language { get; set; }
    public string description { get; set; }
    public string description_language { get; set; }
    public string created_at { get; set; }
    public string uri { get; set; }
    public string web_uri { get; set; }
    public List<object> genres { get; set; }
    public string origin_country { get; set; }
    public string image { get; set; }
    public Subtitles subtitles { get; set; }
    public Formats formats { get; set; }
}

[Serializable]
public class Formats
{
    public string flash_embed { get; set; }
    public string m3u8 { get; set; }
    public string __invalid_name__res150p { get; set; }
    public string __invalid_name__res240p { get; set; }
    public string __invalid_name__res270p { get; set; }
    public string __invalid_name__res360p { get; set; }
    public string __invalid_name__res480p { get; set; }
    public string __invalid_name__res720p { get; set; }
    public string __invalid_name__flv480p { get; set; }
    public string __invalid_name__flv360p { get; set; }
    public string __invalid_name__flv270p { get; set; }
    public string __invalid_name__flvvp6360p { get; set; }
    public string __invalid_name__flvvp6270p { get; set; }
}

【问题讨论】:

  • 你是如何反序列化的?
  • Desriliaing with Type , var rootObj = JsonConvert.DeserializeObject(json);
  • MoviesListRootObject 是什么?
  • 这是失败的确切数据吗?
  • @Ic,已编辑问题

标签: c# .net json json.net


【解决方案1】:

你必须用JsonProperty 属性来装饰你的Formats 属性,以告诉它如果名称不完全匹配会去哪里:

partial class Formats
{
    [JsonProperty("res-150p")]
    public string __invalid_name__res150p {get; set;}
}

另见Using JsonConvert.DeserializeObject to deserialize Json to a C# POCO class

【讨论】:

  • 谢谢,只是好奇知道,我也可以使用属性声明正常的比例并具有不同的名称吗?
  • @Simsons 当然。这就是这里发生的事情,对吧?碰巧您不能使用与 JSON 相同的名称,因此您必须使用新的名称 (__invalid_name__res150p)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多