【问题标题】:Unable to deserialize JSON to an entity using Newtonsoft.Json无法使用 Newtonsoft.Json 将 JSON 反序列化为实体
【发布时间】:2020-07-27 09:07:09
【问题描述】:

这是我从服务收到的示例 JSON,我无法使用 C# 对其进行反序列化。

{
    "columns": [
        "empid",
        "employeename",
        "currentAllocation",
        "Dept head",
        "Manager",
        "department",
        "duration_s",
        "count"
    ],
    "data": [
        [
            1,
            "Jane Doe",
            "Production",
            11,
            "John Doe",
            "Quality",
            26638.0,
            {
                "columns": [
                    "start_timestamp",
                    "duration_s"
                ],
                "data": [
                    [
                        1588351656.54799,
                        450.0
                    ],
                    [
                        1588421798.54799,
                        1438.0
                    ],
                    [
                        1589875223.54799,
                        597.0
                    ]
                ]
            }
        ],
        [
            1,
            "Jane Doe",
            "Production",
            45,
            "Peter Pan",
            "Logistics",
            33379.0,
            {
                "columns": [
                    "start_timestamp",
                    "duration_s"
                ],
                "data": [
                    [
                        1588351656.54799,
                        450.0
                    ],
                    [
                        1588421798.54799,
                        1438.0
                    ],
                    [
                        1589875223.54799,
                        597.0
                    ]
                ]
            }
        ]
    ]
}

我在定义目标对象时遇到问题。特别是,我无法确定 data 节点的结构/格式。看起来应该是List<List<Tuple<string,string,string,string,string,string,Encounter>>>,其中Encounter 是具有两个属性的类:

 public class Encounter
 { 
     public List<string> column 
     public List<Tuple<string,string>> data 
 } 

有人可以提出解决方案吗?

【问题讨论】:

  • 您是否反序列化为对象?您很可能没有正确的目标对象。请提供有关目标对象的更多信息,以及如何尝试反序列化它。没有人可以帮助您提供的最少信息:)
  • 您可以使用link 来了解对象以匹配您的目标对象
  • 你需要使用的类不会特别好,因为在那个 json 中急切地使用列表而不是对象。您将拥有List&lt;List&lt;double&gt;&gt;List&lt;List&lt;object&gt;&gt; 之类的东西,您仍然需要手动将它们分开。
  • 但是,您需要显示您尝试使用的代码。如果您要问如何实际反序列化,答案是构造与该 JSON 结构相对应的类并使用 JsonConvert.DeserializeObject&lt;TypeOfThatClass&gt;(json),但如果您在声明类时遇到问题,则需要展示您所拥有的我们可以查明您的问题。另外,请描述您当前的问题是什么
  • 谢谢,我在确定目标对象时遇到问题。我无法确定数据节点的结构/格式。 List>> 其中遇到的是具有两个属性的类 public class Encounter { public list} column public list>数据}

标签: c# json json.net deserialization json-deserialization


【解决方案1】:

这看起来像是最初从某种嵌套数据表结构序列化而来的。如果您想将其反序列化为连贯的强类型类,则需要JsonConverter 来执行此操作。一种可能的解决方案是使用How to deserialize a JSON array into an object using Json.Net? 中定义的ArrayToObjectConverter&lt;T&gt;JsonArrayIndexAttribute 类然后您可以定义模型类,如下所示。 (您可以将类和属性重命名为任何对您有意义的名称。我只是根据 JSON 和您制作的一些 cmets 进行了猜测。)

public class RootObject
{
    [JsonProperty("data", ItemConverterType = typeof(ArrayToObjectConverter<Item>))]
    public List<Item> Items { get; set; }
}

public class Item
{
    [JsonArrayIndex(0)]
    public int EmployeeId { get; set; }
    [JsonArrayIndex(1)]
    public string EmployeeName { get; set; }
    [JsonArrayIndex(2)]
    public string CurrentAllocation { get; set; }
    [JsonArrayIndex(3)]
    public int DepartmentHead { get; set; }
    [JsonArrayIndex(4)]
    public string Manager { get; set; }
    [JsonArrayIndex(5)]
    public string Department { get; set; }
    [JsonArrayIndex(6)]
    public double Duration { get; set; }
    [JsonArrayIndex(7)]
    public EncounterData EncounterData { get; set; }
}

public class EncounterData
{
    [JsonProperty("data", ItemConverterType = typeof(ArrayToObjectConverter<Encounter>))]
    public List<Encounter> Encounters { get; set; }
}

public class Encounter
{
    [JsonArrayIndex(0)]
    public double StartTimestamp { get; set; }
    [JsonArrayIndex(1)]
    public double Duration { get; set; }
}

public class JsonArrayIndexAttribute : Attribute
{
    public int Index { get; private set; }
    public JsonArrayIndexAttribute(int index)
    {
        Index = index;
    }
}

最后像这样反序列化:

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

这是一个工作演示:https://dotnetfiddle.net/A7kp7L

【讨论】:

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