【问题标题】:Deserializing JSON in C# with Known Object Names在 C# 中使用已知对象名称反序列化 JSON
【发布时间】:2021-04-11 17:59:33
【问题描述】:

我正在尝试反序列化具有已知对象名称的 json,但我很难找到一个好的示例。

我可以使用:
dynamic meta = JsonConvert.DeserializeObject( json );
可行,但我想使用:
metadata meta = JsonConvert.DeserializeObject<metadata>( json );
但似乎不起作用。

{
  "metadata": {
    "topic": "Some Topic",
    "schemaVersion": "1.0",
    "deprecated": false
  },
  "notification": {
    "notificationId": "c829ec0b9b24",
    "eventDate": "2021-04-11T14:58:19.019Z",
    "publishDate": "2021-04-11T14:58:22.599Z",
    "publishAttemptCount": 1,
    "data": {
      "username": "UserName",
      "userId": "UserId",
      "eiasToken": "Token"
    }
  }
}

public class metadata
{
    public String topic { get; set; }

    public String schemaVersion { get; set; }

    public Boolean deprecated { get; set; }
}

public class notification
{
    public String notificationId { get; set; }

    public DateTime eventDate { get; set; }

    public DateTime publishDate { get; set; }

    public Int32 publishAttemptCount { get; set; }

    public Data data { get; set; }
}

public class Data
{
    public String username { get; set; }

    public String userId { get; set; }

    public String eiasToken { get; set; }
}

页面加载事件

String json;

using ( StreamReader reader = new StreamReader( Request.InputStream ) )
{
    json = reader.ReadToEnd();
}
                
metadata meta = JsonConvert.DeserializeObject<metadata>( json );

//meta class is null and does not contain data
//Next line evaluates to NULL and does not work

String topic = meta.topic;

【问题讨论】:

  • 试试public class Root { public metadata metadata { get; set; } public notification notification { get; set; } },然后JsonConvert.DeserializeObject&lt;Root&gt;(json);

标签: c# json serialization


【解决方案1】:

您的 JSON 字符串表示具有元数据和通知属性的对象。所以,你应该像这样创建一个根对象:

public class RootObj
    {
        public Metadata metadata { get; set; }
        public Notification notification { get; set; }
    }

并像这样使用:

RootObj myObj = JsonConvert.DeserializeObject<RootObj>( json );

【讨论】:

    【解决方案2】:

    如果您只需要解析元数据部分,那么您可以使用JObect

    var semiParsedJson = JObject.Parse(json);
    var metaRaw = semiParsedJson["metadata"];
    
    if(metaRaw == null) return;
    var meta = metaRaw.ToObject<metadata>();
    

    【讨论】:

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