C# 在单个对象中反序列化两个 Jarray 对象

Posted

技术标签:

【中文标题】C# 在单个对象中反序列化两个 Jarray 对象【英文标题】:C# Deserialize Two Jarray Objects in Single Object 【发布时间】:2020-11-21 21:48:37 【问题描述】:

我有一个以这种格式返回响应的外部 API:


    "responses": [
        
            "columnHeadersCount": 1,
            "data": [
                [
                    "1",
                    "John",
                    "Smith",
                    "50"
                ],
                [
                    "2",
                    "Liam",
                    "Miller",
                    "10"
                ]               
            ],
            "headerOrientation": "horizontal",
            "headers": [
                [
                    
                        "displayName": "Id"
                    ,
                    
                        "displayName": "First Name",
                        "field": "FirstNameField"
                    ,
                    
                        "displayName": "Last Name",
                        "field": "LastNameField"
                    ,
                    
                        "displayName": "Age",
                        "field": "AgeField"
                    
                    
                ]
            ],
            "totalColumnsCount": 4
        
    ]

我有一个类,我希望将 API 响应反序列化为

Student.cs    

public class Student


    public int Id  get; set; 

    [JsonProperty("firstName")]
    public string FirstName  get; set; 
    
    [JsonProperty("lastName")]
    public string LastName  get; set; 
    
    public int Age  get; set; 

我的问题是,鉴于我拥有的 API 响应的结构,我如何将响应反序列化到此类中?

我尝试创建一个名为 APIResponse.cs 的类并将 Headers 和 Data 映射到 JArray。目前,我使用以下代码将其反序列化为 APIResponse.cs:

var jsonResponse = JsonConvert.DeserializeObject(json.ToString());

public class ApiResponse

    public JArray Data  get; set; 
    public JArray Headers  get; set; 

所以我希望我的标题和数据在学生对象中反序列化。 有什么想法吗?感谢您的帮助。

谢谢!

【问题讨论】:

Json 看起来很脏。你能粘贴真正的有效载荷吗谢谢。这也不是一个有效的 C# 类。 专业提示尽量不要让人们更努力地工作,需要阅读、测试并为您提供解决方案 给定的 JSON 数据格式不正确。提供正确的 Json 数据 @TheGeneral 我已经更新了上面的 JSON。谢谢 @Imran 谢谢,我的错,我在上面提供了正确的 JSON 首先,不要这样做:[JsonProperty("First Name")]——这不是一个有效的 JSON 属性名称。应该是[JsonProperty("firstName")] 【参考方案1】:

为此,您必须按照以下步骤操作:

1-创建以下类来反序列化对象中的数据。

public class MainClass

    public List<Response> Responses  get; set; 


public class Response

    public long ColumnHeadersCount  get; set; 
    public List<List<string>> Data  get; set; 
    public string HeaderOrientation  get; set; 
    public List<List<Header>> Headers  get; set; 
    public long TotalColumnsCount  get; set; 


public class Header

    public string DisplayName  get; set; 
    public string Field  get; set; 

2- 反序列化您的 Json 字符串,如下所示:

var deserializedObj = JsonConvert.DeserializeObject<MainClass>(YourJsonString);

3- 从此deserializedObj,您可以获得您的学生收藏:

var studentCollection = deserializedObj.Responses[0].Data;

更新答案

4-获取学生类型列表中的studentCollection数据:

List<Student> student = new List<Student>();
foreach(var item in studentCollection)

    var std = new Student()
    
        Id = int.Parse(item[0]),
        FirstName = item[1],
        LastName = item[2],
        Age = int.Parse(item[3])
    ;
    student.Add(std);

【讨论】:

谢谢@Imran,这有帮助!我可以将 studentCollection 作为 List 吗?我的意思是如何将它反序列化为我的 Student.cs,因为该集合没有 jsonpropertyname 不能在Student类型List中直接反序列化,但是在得到studentCollection后,循环进入Student类型集合。检查它,我将在答案中更新。 是的,谢谢,如果我在 studentCollection 上循环,我看到的唯一警告是当我有大型数据集时,>5000 个项目。 是的,对于大型数据集,它可能会很昂贵,但由于接收 Json 格式,您必须承担它。

以上是关于C# 在单个对象中反序列化两个 Jarray 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中反序列化多个 JSON 对象?

使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]

无论如何在 C# 中反序列化之前检查对象的类类型?

如何在 C# .NET 中反序列化复杂的 JSON 对象?

使用jackson从改造中反序列化json,其中相同的变量名可以代表两个不同的对象

无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误