【问题标题】:Deserializing JSON from API call Dynamically从 API 调用动态反序列化 JSON
【发布时间】:2020-02-03 01:42:44
【问题描述】:

我使用的 API 调用返回类似于下面的 JSON

{
    "d": {
        "results": [
            {
                "Id": "Test01",
                "Version": ""

            }
        ],
        "count": 0
    }
}

无论如何我可以动态反序列化这个还是应该创建 POCO 类来这样做?

【问题讨论】:

  • 答案是肯定的,而且可能是肯定的。第一部分你可以使用JObject.Parse,第二部分为什么不直接构建一个具体的类并进行强类型化
  • 嗨@MichaelRandall 动态地这样做比创建 POCO 类更好吗?
  • C# 是一种强类型语言,其约定使用强类型方法。然而,从网络调用返回的 json 有时至少可以说是令人困惑的,最坏的情况是随机的。在某些情况下,您必须使用 JObject 之类的东西来探索 json 结果。
  • 你认为这是一个更适合 JObject 的实例吗?为什么我要问这个,我认为有一个类名“D”是可笑的,但又是 nuget API 返回 JSON 的方式”
  • 如果您的结果包含总是具有Idversion的对象,则使用POCO。如果不是,并且您希望一个对象中的版本和下一个对象中的完全不同的属性,请使用动态对象而不是强类型类

标签: c# .net json deserialization


【解决方案1】:

对于您的问题,我正在使用Newtonsoft JSON 库,它是一个流行的 .NET 高性能 JSON 框架。

你可以在这里反序列化你的JSON字符串:

1) 为您的JSON 字符串使用 POCO 类:

public class Result
{
    public string Id { get; set; }
    public string Version { get; set; }
}

public class D
{
    public List<Result> results { get; set; }
    public int count { get; set; }
}

public class RootObject
{
    public D d { get; set; }
}

反序列化:

var Sresponse = JsonConvert.DeserializeObject<RootObject>(json);

2) 如果您不想使用POCO 类,可以使用dynamic

var dynamicresponse = JsonConvert.DeserializeObject<dynamic>(json);

输出:

Id: Test01
Version: 
Count: 0

可以找到说明这两种情况的工作示例here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2015-11-22
    • 2019-12-20
    • 1970-01-01
    • 2018-02-20
    • 2020-08-30
    • 2012-11-11
    相关资源
    最近更新 更多