【问题标题】:How can I de-serialize this json with C#?如何用 C# 反序列化这个 json?
【发布时间】:2015-03-18 10:48:57
【问题描述】:

使用 C#,我尝试反序列化此 json 内容但没有成功:

{
    "code":200,
    "message":"OK",
    "name":"The name",
    "description":"The description",
    "tags":{
        "0.1.3":{
            "date":"2015-03-11",
            "author":"SOMEONE",
        },
        "0.1.2":{
            "date":"2015-03-11",
            "author":"SOMEONE",
        }
    }
}

您已经注意到,有一个“标记”对象列表,但我没有表格。

目标类的开始:

[DataContract]
public class Project
{
    [DataMember]
    public int code { get; set; }
    [DataMember]
    public string message { get; set; }
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public string description { get; set; }

    [DataMember]
        **How can I handle tags entries ?**
}

[DataContract]
public class Tag
{
    [DataMember]
    public string date { get; set; }

    [DataMember]
    public string author { get; set; }
}

【问题讨论】:

  • 你可以在这里验证任何 json 字符串 jsonlint.org
  • 你的sn-ps不是JSON,请供应商发送JSON。
  • 致 Jodrell :这里没有列出整个 json 内容,只列出了我不知道如何进行反序列化的部分。
  • 有了新信息,我相信您可以使用Dictionary<string, Tag> 对其进行反序列化,但我不确定它是否会自动工作
  • public Dictionary<string, Tag> tags { get; set; }

标签: c# json list object


【解决方案1】:

如果您使用的是 JSON.NET,那么您可以拥有以下内容:

[DataContract]
public class Project
{
    [DataMember]
    public int code { get; set; }
    [DataMember]
    public string message { get; set; }
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public string description { get; set; }

    [DataMember]
    public Dictionary<string, Tag> tags { get; set; }
}

[DataContract]
public class Tag
{
    [DataMember]
    public string date { get; set; }

    [DataMember]
    public string author { get; set; }
}

然后您将使用以下方式(假设 responseString 包含您的 JSON):

Project project = JsonConvert.DeserializeObject<Project>(responseString);

foreach (KeyValuePair<string, Tag> tag in project.tags)
{
    Debug.WriteLine("Version: {0}", tag.Key);
    Debug.WriteLine("Date: {0}", tag.Value.date);
    Debug.WriteLine("Author: {0}", tag.Value.author);
}

【讨论】:

  • 不幸的是,我已经尝试过 Dictionnary 类型,但它不起作用。对象的计数 = 0。
  • 我不使用 JsonConvert,只使用 DataContractJsonSerializer。有没有办法在不安装 nuget 包的情况下完成这项工作?
  • @P.Debrabant,对不起,我不知道 DataContractJsonSerializer 是如何工作的。我仍然会推荐 JSON.NET,但是否要使用它取决于你。
  • 重要的一行是:settings.UseSimpleDictionaryFormat = true;
  • 感谢您的链接,它解决了我的问题。如果我使用“settings.UseSimpleDictionaryFormat = true;”我得到了 Dictionnary 条目。
【解决方案2】:

根据 RFC 4627(JSON 规范),JSON 输入是有效的。

http://www.freeformatter.com/json-validator.html

【讨论】:

    【解决方案3】:

    JSON 结构基于键值对。正确的 JSON 格式如下:

    {
    "object":{
        "DataMember1":"String content",
        "DataMember2":"String content",
        "DataMember3":"String content"
    },
    "object2":{
        "DataMember1":"String content",
        "DataMember2":"String content"
    }
    

    }

    转到basics

    要检查您的 json 结构,您可以从 click here 进行验证

    【讨论】:

    • 是的,我知道基础知识并且我有键 + 值对。我在验证器上检查了整个格式,它是正确的。但是我该如何管理内容呢?
    • @P.Debrabant 您可以在 c# 代码中使用 javascript 序列化程序。为此,请创建一个具有与您的 json 结构相同的数据成员的 DTO。然后将 json 文本反序列化为类对象。
    • 这是问题所在。我不知道如何处理标签对象。你能完成我在更新后的帖子中提出的父类吗?
    • [链接] (tomasvera.com/programming/…) @P.Debrabant
    • ' [DataContract] Class CombineClass { [DataMember] public Project objProject {get;set;} [DataMember] public List objTaglist {get;set;} } 你的 Json 应该这样包装{ "objProject": { "code":200, "message":"OK", "name":"The name", "description":"The description" }, "objTag": { "date":"" , "作者":"" } } '
    【解决方案4】:

    嗯,我能够反序列化:

    Newtonsoft.Json.JsonConvert.DeserializeObject<Project>(json);
    

    但是,这是我的类定义:

     public class Project
    {
    
        public string code { get; set; }
    
        public string message { get; set; }
    
        public string name { get; set; }
    
        public string description { get; set; }
    
        public Dictionary<string,Tag> tags { get; set; }
    }
    
    
    public class Tag
    {
    
        public string date { get; set; }
    
        public string author { get; set; }
    }
    

    【讨论】:

      【解决方案5】:

      感谢阿图罗·托雷斯·桑切斯。要获取“标签”条目,声明必须是:

      [DataContract]
      public class Project
      {
          [DataMember]
          public int code { get; set; }
          [DataMember]
          public string message { get; set; }
          [DataMember]
          public string name { get; set; }
          [DataMember]
          public string description { get; set; }
          [DataMember]
          public Dictionary<string, Tag> tags { get; set; }
      }
      

      最重要的是,我必须在创建 DataContractJsonSerializer 的实例时修改默认设置并使用新设置。

      DataContractJsonSerializerSettings settings = 
                  new DataContractJsonSerializerSettings();
      settings.UseSimpleDictionaryFormat = true;
      
      DataContractJsonSerializer serializer = 
                  new DataContractJsonSerializer(typeof(Project), settings);
      
      Project results = (Project)serializer.ReadObject(ms);
      

      没有settings.UseSimpleDictionaryFormat = true;标签的对象数为0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 2021-09-06
        • 2018-07-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多