将客户的 Key+Value JSON 对象响应转换为 C# 模型

问题描述

我有这个API,我想创建一个动态对象。我的意思是要处理普通对象而不是这个API返回给我的东西,我无法控制这个API所以检索到的数据不能被修改,这是主体,它代表数据库中的一个视图

此外,我认为在这种情况下,反思可以帮助我,任何想法......

请求正文:

{
    "ViewName": "Person","ViewOutput": "Name,Email,Number","ViewFilter": [
        {
            "filterKey": "Number","filterValue": "532000000"
        }
    ]
}

我希望对 ViewName + ViewOutput+ ViewFilter 进行参数化, ViewName 它将采用单个值, ViewOutput 将是字符串数组 ViewFilter 将是过滤列表(“FilterKey”、“FilterVlaue”),因为它可能是多个过滤值,如下所示:

"ViewFilter": [
        {
            "filterKey": "Number","filterValue": "532000000"
        },{
            "filterKey": "Email","filterValue": "test1@test.ps"
        }
    ]

This is What API Return to me,Person Keys 和 Values 的列表,

回复

{
    "ResponseCode": "0","ResponseMessage": "Success","NumberOfRecords": "1","MainData": [
        {
            "recordData": [
                {
                    "dataKey": "Name","dataValue": "Test Name"
                },{
                    "dataKey": "Email","dataValue": "test@test.ps"
                },{
                    "dataKey": "Number","dataValue": "532000000"
                }
            ]
        }
    ]
}

我想要的输出是这样的:

"Person": [
{
    "Name":"Test","Email":"test@test.ps","Number":"532000000",}]

解决方法

使用 Paste JSON As Classes 功能将响应 JSON 粘贴到 Visual Studio 中的空类文件中,生成以下类:

public class Rootobject
{
    public string ResponseCode { get; set; }
    public string ResponseMessage { get; set; }
    public string NumberOfRecords { get; set; }
    public Maindata[] MainData { get; set; }
}

public class Maindata
{
    public Recorddata[] recordData { get; set; }
}

public class Recorddata
{
    public string dataKey { get; set; }
    public string dataValue { get; set; }
}

您可以创建自己的 Person 类。

将 JSON 反序列化为生成的类后,获得 List<Person> 的一种方法是执行以下操作(请注意,这是未经测试的示例代码):

var people = rootObject.Maindata.Select(r => 
    {
        var name = r.recordData.Single(d => d.dataKey == "Name").dataValue;
        var email = r.recordData.Single(d => d.dataKey == "Email").dataValue;
        var number = r.recordData.Single(d => d.dataKey == "Number").dataValue;
        return new Person(name,email,number);     
    }).ToList();