Newtonsoft.Json.JsonHelper 父子结构数据改成数据平铺

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;

namespace BLL.Utilities
{
    public class JsonHelper
    {
        public static string SerializeAndFlatten(string prefix, object obj)
        {
            Dictionary<string, object> dict = new Dictionary<string, object>();
            var json = JsonConvert.SerializeObject(obj);
            JToken token = JToken.Parse(json);
            FillDictionaryFromJToken(dict, token, prefix);
            return JsonConvert.SerializeObject(dict);
        }

        private static void FillDictionaryFromJToken(Dictionary<string, object> dict, JToken token, string prefix)
        {
            switch (token.Type)
            {
                case JTokenType.Object:
                    foreach (JProperty prop in token.Children<JProperty>())
                    {
                        FillDictionaryFromJToken(dict, prop.Value, Join(prefix, prop.Name));
                    }
                    break;

                case JTokenType.Array:
                    int index = 0;
                    foreach (JToken value in token.Children())
                    {
                        FillDictionaryFromJToken(dict, value, string.Join("", prefix, index));
                        index++;
                    }
                    break;

                default:
                    dict.Add(prefix, ((JValue)token).Value);
                    break;
            }
        }

        private static string Join(string prefix, string name)
        {
            return (string.IsNullOrEmpty(prefix) ? name : string.Join("_", prefix, name));
        }
    }
}

调用

var result = JsonHelper.SerializeAndFlatten(string.Empty, new { Result = QueryStatus.Success.ToString(), ErrorCode = string.Empty, ErrorMessage = string.Empty, CustomerIndicator = indicator, QueryResult = new QueryResult() });

父子结构属性

    public class QueryResult
    {
        [JsonIgnore]
        public DateTime CreatedTime { get; set; }

        [JsonProperty("reportHeader")]
        public virtual ReportHeader ReportHeader { get; set; }

        [JsonProperty("personalProfile")]
        public virtual PersonalProfile PersonalProfile { get; set; }

        [JsonProperty("homeInfo")]
        public virtual List<HomeInfo> HomeInfo { get; set; }

        [JsonProperty("workInfo")]
        public virtual List<WorkInfo> WorkInfo { get; set; }

        [JsonProperty("nonRevolvingLoan")]
        public virtual NonRevolvingLoan NonRevolvingLoan { get; set; }

        [JsonProperty("revolvingLoan")]
        public virtual RevolvingLoan RevolvingLoan { get; set; }

        [JsonProperty("queryHistory")]
        public virtual List<QueryHistory> QueryHistory { get; set; }
    }
    public class ReportHeader
    {
        [ForeignKey("BhQueryResult")]
        [JsonIgnore]
        public long ReportHeaderId { get; set; }

        [JsonProperty("reportId")]
        [MaxLength(30)]
        public string ReportId { get; set; }

        [JsonProperty("reportTime")]
        public DateTime ReportTime { get; set; }

        [JsonProperty("queryResult")]
        public int QueryResult { get; set; }
    }


    public class PersonalProfile
    {
        [ForeignKey("BhQueryResult")]
        [JsonIgnore]
        public long PersonalProfileId { get; set; }

        [JsonProperty("name")]
        [MaxLength(30)]
        public string Name { get; set; }

        [JsonProperty("pid")]
        [MaxLength(20)]
        public string Pid { get; set; }

        [JsonProperty("mobileCount")]
        public int MobileCount { get; set; }
    }


    public class HomeInfo
    {
        [JsonIgnore]
        public long HomeInfoId { get; set; }

        [JsonProperty("homeAddress")]
        [MaxLength(200)]
        public string HomeAddress { get; set; }

        [JsonProperty("date")]
        public DateTime Date { get; set; }
    }

    public class WorkInfo
    {
        [JsonIgnore]
        public long WorkInfoId { get; set; }

        [JsonProperty("workName")]
        [MaxLength(100)]
        public string WorkName { get; set; }

        [JsonProperty("workAddress")]
        [MaxLength(200)]
        public string WorkAddress { get; set; }

        [JsonProperty("date")]
        public DateTime Date { get; set; }
    }


    public class NonRevolvingLoan
    {
        [ForeignKey("BhQueryResult")]
        [JsonIgnore]
        public long NonRevolvingLoanId { get; set; }

        [JsonProperty("summary")]
        public virtual NonRevolvingLoanSummary Summary { get; set; }

        [JsonProperty("D30")]
        public virtual NonRevolvingLoanDetail D30 { get; set; }

        [JsonProperty("D90")]
        public virtual NonRevolvingLoanDetail D90 { get; set; }

        [JsonProperty("D180")]
        public virtual NonRevolvingLoanDetail D180 { get; set; }

        [JsonProperty("D360")]
        public virtual NonRevolvingLoanDetail D360 { get; set; }
    }


    public class RevolvingLoan
    {
        [ForeignKey("BhQueryResult")]
        [JsonIgnore]
        public long RevolvingLoanId { get; set; }

        [JsonProperty("summary")]
        public virtual RevolvingLoanSummary Summary { get; set; }

        [JsonProperty("D30")]
        public virtual RevolvingLoanDetail D30 { get; set; }

        [JsonProperty("D90")]
        public virtual RevolvingLoanDetail D90 { get; set; }

        [JsonProperty("D180")]
        public virtual RevolvingLoanDetail D180 { get; set; }

        [JsonProperty("D360")]
        public virtual RevolvingLoanDetail D360 { get; set; }
    }


    public class QueryHistory
    {
        [Key]
        [JsonIgnore]
        public long QueryHistoryId { get; set; }

        [JsonProperty("tenantType")]
        [MaxLength(30)]
        public string TenantType { get; set; }

        [JsonProperty("tenantName")]
        [MaxLength(50)]
        public string TenantName { get; set; }

        [JsonProperty("userId")]
        [MaxLength(30)]
        public string UserId { get; set; }

        [JsonProperty("date")]
        public DateTime Date { get; set; }

        [JsonProperty("reason")]
        public int Reason { get; set; }
    }

Json data

{
    "Data": {
        "reportHeader": {
            "reportId": "CS1909291422585066440189",
            "reportTime": "2019-09-29T14:22:58",
            "queryResult": 1
        },
        "personalProfile": {
            "name": "霍测试",
            "pid": "111111198988888888",
            "mobileCount": 1
        },
        "homeInfo": [
            {
                "homeAddress": "联调市测试县**********",
                "date": "2019-08-16T00:00:00"
            },
            {
                "homeAddress": "联调市测试县**********",
                "date": "2019-08-16T00:00:00"
            }
        ],
        "workInfo": [],
        "nonRevolvingLoan": {
            "summary": {
                "loanCount": 1,
                "openLoanCount": 1,
                "remainingAmount": 53000.0,
                "remainingOverdueLoanCount": 0,
                "remainingOverdueAmount": 0.0,
                "remainingMaxOverdueStatus": "N",
                "overdueCount": 0,
                "maxOverdueStatus": "N",
                "lastCompensationDate": null
            },
            "D30": {
                "applyTenantCount": -1,
                "loanCount": 0,
                "loanAmount": 0.0,
                "loanTenantCount": 0,
                "maxLoanAmount": 0.0,
                "averageLoanAmount": 0.0,
                "overdueLoanCount": 0,
                "compensationAmount": 0.0,
                "compensationCount": 0.0,
                "compensationTimes": 0.0
            },
            "D90": {
                "applyTenantCount": -1,
                "loanCount": 1,
                "loanAmount": 53000.0,
                "loanTenantCount": 1,
                "maxLoanAmount": 53000.0,
                "averageLoanAmount": 53000.0,
                "overdueLoanCount": 0,
                "compensationAmount": 0.0,
                "compensationCount": 0.0,
                "compensationTimes": 0.0
            },
            "D180": {
                "applyTenantCount": -1,
                "loanCount": 1,
                "loanAmount": 53000.0,
                "loanTenantCount": 1,
                "maxLoanAmount": 53000.0,
                "averageLoanAmount": 53000.0,
                "overdueLoanCount": 0,
                "compensationAmount": 0.0,
                "compensationCount": 0.0,
                "compensationTimes": 0.0
            },
            "D360": {
                "applyTenantCount": -1,
                "loanCount": 1,
                "loanAmount": 53000.0,
                "loanTenantCount": 1,
                "maxLoanAmount": 53000.0,
                "averageLoanAmount": 53000.0,
                "overdueLoanCount": 0,
                "compensationAmount": 0.0,
                "compensationCount": 0.0,
                "compensationTimes": 0.0
            }
        },
        "revolvingLoan": {
            "summary": {
                "accountCount": 0,
                "validAccountCount": 0,
                "creditLimitSum": 0.0,
                "maxCreditLimitPerTenant": 0.0,
                "remainingAmount": 0.0,
                "remainingOverdueAccountCount": 0,
                "remainingOverdueAmount": 0.0,
                "remainingMaxOverdueStatus": "N",
                "overdueCount": 0,
                "maxOverdueStatus": "N",
                "revolvingLastCompensationDate": null
            },
            "D30": {
                "applyTenantCount": -1,
                "accountCount": 0,
                "creditLimitSum": 0.0,
                "lendingAmount": 0.0,
                "overdueAccountCount": 0,
                "revolvingCompensationAmount": 0.0,
                "revolvingCompensationTimes": 0.0,
                "revolvingCompensationCount": 0.0
            },
            "D90": {
                "applyTenantCount": -1,
                "accountCount": 0,
                "creditLimitSum": 0.0,
                "lendingAmount": 0.0,
                "overdueAccountCount": 0,
                "revolvingCompensationAmount": 0.0,
                "revolvingCompensationTimes": 0.0,
                "revolvingCompensationCount": 0.0
            },
            "D180": {
                "applyTenantCount": -1,
                "accountCount": 0,
                "creditLimitSum": 0.0,
                "lendingAmount": 0.0,
                "overdueAccountCount": 0,
                "revolvingCompensationAmount": 0.0,
                "revolvingCompensationTimes": 0.0,
                "revolvingCompensationCount": 0.0
            },
            "D360": {
                "applyTenantCount": -1,
                "accountCount": 0,
                "creditLimitSum": 0.0,
                "lendingAmount": 0.0,
                "overdueAccountCount": 0,
                "revolvingCompensationAmount": 0.0,
                "revolvingCompensationTimes": 0.0,
                "revolvingCompensationCount": 0.0
            }
        },
        "queryHistory": [
            {
                "tenantType": "-",
                "tenantName": "联调测试(天津)有限公司",
                "userId": "DZQCJRZL_TEST_1",
                "date": "2019-09-29T00:00:00",
                "reason": 1
            },
            {
                "tenantType": "-",
                "tenantName": "联调测试(天津)有限公司",
                "userId": "DZQCJRZL_TEST_1",
                "date": "2019-09-29T00:00:00",
                "reason": 1
            },
            {
                "tenantType": "-",
                "tenantName": "联调测试(天津)有限公司",
                "userId": "DZQCJRZL_TEST_1",
                "date": "2019-09-29T00:00:00",
                "reason": 1
            },
            {
                "tenantType": "-",
                "tenantName": "联调测试(天津)有限公司",
                "userId": "DZQCJRZL_TEST_1",
                "date": "2019-09-29T00:00:00",
                "reason": 1
            },
            {
                "tenantType": "-",
                "tenantName": "联调测试(天津)有限公司",
                "userId": "DZQCJRZL_TEST_1",
                "date": "2019-09-29T00:00:00",
                "reason": 1
            },
            {
                "tenantType": "-",
                "tenantName": "联调测试(天津)有限公司",
                "userId": "DZQCJRZL_TEST_1",
                "date": "2019-09-25T00:00:00",
                "reason": 6
            },
            {
                "tenantType": "-",
                "tenantName": "联调测试(天津)有限公司",
                "userId": "DZQCJRZL_TEST_1",
                "date": "2019-09-25T00:00:00",
                "reason": 1
            }
        ]
    },
    "StatusCode": "200",
    "StatusMessage": "Successful",
    "Success": true
}
原文地址:https://www.cnblogs.com/hofmann/p/15714413.html