创建一个类来构建一个JSON结构,其中一个变量再次包含来自它自己的类(C#)的所有变量

创建一个类来构建一个JSON结构,其中一个变量再次包含来自它自己的类(C#)的所有变量,c#,json,C#,Json,我已经思考了一段时间,我想我可能只是缺少了一个基本的编码方法来解决这个问题。 这就是我所尝试的: class DataSetCommonQuery { public string @operator; public List<DataSetCommonQuery> rules = new List<DataSetCommonQuery>(); } 类数据集CommonQuery { 公共字符串@运算符; 公共列表规则

我已经思考了一段时间,我想我可能只是缺少了一个基本的编码方法来解决这个问题。 这就是我所尝试的:

   class DataSetCommonQuery
    {
        public string @operator;
        public List<DataSetCommonQuery> rules = new List<DataSetCommonQuery>();
    }
类数据集CommonQuery
{
公共字符串@运算符;
公共列表规则=新列表();
}
我期望的JSON应该是:

    {
    "payLoad": {
        "DataSetCommonQuery": {
            "operator": "AND",
            "rules": [{
                    "field": "ENTITY.CIFNumber",
                    "condition": "<>",
                    "value": "3123"
                },
                {
                    "field": "ENTITY.Country",
                    "condition": "LIKE",
                    "value": "USA"
                },
                {
                    "operator": "OR",
                    "rules": [{
                            "field": "ENTITY.FYEMonth",
                            "condition": "=",
                            "value": "May"
                        },
                        {
                            "field": "STATEMENT.ProfitBeforeTax",
                            "condition": ">=",
                            "value": 123123
                        },
                        {
                            "field": "STATEMENT.NetSales",
                            "condition": "<=",
                            "value": 234234
                        },
                        {
                            "field": "STATEMENT.statementdatekey_",
                            "condition": "=",
                            "value": "2019-07-01 12:00:00"
                        }
                    ]
                }
            ]
        }
    }
}
{
“有效载荷”:{
“DataSetCommonQuery”:{
“操作员”:“和”,
“规则”:[{
“字段”:“ENTITY.CIFNumber”,
“条件”:“,
“值”:“3123”
},
{
“字段”:“实体.国家”,
“条件”:“喜欢”,
“价值”:“美国”
},
{
“操作员”:“或”,
“规则”:[{
“字段”:“ENTITY.FYEMonth”,
“条件”:“=”,
“价值”:“可能”
},
{
“字段”:“STATEMENT.ProfitBeforeTax”,
“条件”:“>=”,
“价值”:123123
},
{
“字段”:“STATEMENT.NetSales”,

“条件”:“您是否尝试过这样的站点转换器”

这确实是一个好问题,建议您选择Newtonsoft.json并执行类似操作

public partial class StackOverFlow
{
    [JsonProperty("payLoad")]
    public PayLoad PayLoad { get; set; }
}

public partial class PayLoad
{
    [JsonProperty("DataSetCommonQuery")]
    public DataSetCommonQuery DataSetCommonQuery { get; set; }
}

public partial class DataSetCommonQuery
{
    [JsonProperty("operator")]
    public string Operator { get; set; }

    [JsonProperty("rules")]
    public DataSetCommonQueryRule[] Rules { get; set; }
}

public partial class DataSetCommonQueryRule
{
    [JsonProperty("field", NullValueHandling = NullValueHandling.Ignore)]
    public string Field { get; set; }

    [JsonProperty("condition", NullValueHandling = NullValueHandling.Ignore)]
    public string Condition { get; set; }

    [JsonProperty("value", NullValueHandling = NullValueHandling.Ignore)]
    public string Value { get; set; }

    [JsonProperty("operator", NullValueHandling = NullValueHandling.Ignore)]
    public string Operator { get; set; }

    [JsonProperty("rules", NullValueHandling = NullValueHandling.Ignore)]
    public RuleRule[] Rules { get; set; }
}

public partial class RuleRule
{
    [JsonProperty("field")]
    public string Field { get; set; }

    [JsonProperty("condition")]
    public string Condition { get; set; }

    [JsonProperty("value")]
    public Value Value { get; set; }
}

public partial struct Value
{
    public long? Integer;
    public string String;

    public static implicit operator Value(long Integer) => new Value { Integer = Integer };
    public static implicit operator Value(string String) => new Value { String = String };
}

internal static class Converter
{
    public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
        DateParseHandling = DateParseHandling.None,
        Converters =
        {
            ValueConverter.Singleton,
            new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
        },
    };
}

internal class ValueConverter : JsonConverter
{
    public override bool CanConvert(Type t) => t == typeof(Value) || t == typeof(Value?);

    public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
    {
        switch (reader.TokenType)
        {
            case JsonToken.Integer:
                var integerValue = serializer.Deserialize<long>(reader);
                return new Value { Integer = integerValue };
            case JsonToken.String:
            case JsonToken.Date:
                var stringValue = serializer.Deserialize<string>(reader);
                return new Value { String = stringValue };
        }
        throw new Exception();
    }

    public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
    {
        var value = (Value)untypedValue;
        if (value.Integer != null)
        {
            serializer.Serialize(writer, value.Integer.Value);
            return;
        }
        if (value.String != null)
        {
            serializer.Serialize(writer, value.String);
            return;
        }
        throw new Exception();
    }

    public static readonly ValueConverter Singleton = new ValueConverter();
}
公共部分类堆栈溢出
{
[JsonProperty(“有效载荷”)]
公共有效负载{get;set;}
}
公共部分类有效载荷
{
[JsonProperty(“DataSetCommonQuery”)]
公共数据集CommonQuery数据集CommonQuery{get;set;}
}
公共部分类DataSetCommonQuery
{
[JsonProperty(“运营商”)]
公共字符串运算符{get;set;}
[JsonProperty(“规则”)]
公共数据集CommonQueryRule[]规则{get;set;}
}
公共部分类DataSetCommonQueryRule
{
[JsonProperty(“字段”,NullValueHandling=NullValueHandling.Ignore)]
公共字符串字段{get;set;}
[JsonProperty(“条件”,NullValueHandling=NullValueHandling.Ignore)]
公共字符串条件{get;set;}
[JsonProperty(“value”,NullValueHandling=NullValueHandling.Ignore)]
公共字符串值{get;set;}
[JsonProperty(“运算符”,NullValueHandling=NullValueHandling.Ignore)]
公共字符串运算符{get;set;}
[JsonProperty(“规则”,NullValueHandling=NullValueHandling.Ignore)]
公共规则规则[]规则{get;set;}
}
公共部分类规则
{
[JsonProperty(“字段”)]
公共字符串字段{get;set;}
[JsonProperty(“条件”)]
公共字符串条件{get;set;}
[JsonProperty(“价值”)]
公共值{get;set;}
}
公共部分结构值
{
公共长整数;
公共字符串;
公共静态隐式运算符值(长整数)=>新值{Integer=Integer};
公共静态隐式运算符值(字符串)=>新值{string=string};
}
内部静态类转换器
{
公共静态只读JsonSerializerSettings设置=新JsonSerializerSettings
{
MetadataPropertyHandling=MetadataPropertyHandling.Ignore,
DateParseHandling=DateParseHandling.None,
转换器=
{
ValueConverter.Singleton,
新的IsoDateTimeConverter{DateTimeStyles=DateTimeStyles.AssumeUniversal}
},
};
}
内部类值转换器:JsonConverter
{
公共覆盖布尔CanConvert(Type t)=>t==typeof(Value)| | t==typeof(Value?);
公共重写对象ReadJson(JsonReader阅读器,类型t,对象existingValue,JsonSerializer序列化程序)
{
开关(reader.TokenType)
{
案例JsonToken.Integer:
var integerValue=序列化程序。反序列化(读取器);
返回新值{Integer=integerValue};
case JsonToken.String:
案例JsonToken。日期:
var stringValue=serializer.Deserialize(读取器);
返回新值{String=stringValue};
}
抛出新异常();
}
public override void WriteJson(JsonWriter编写器、对象非类型化值、JsonSerializer序列化器)
{
var值=(值)非类型值;
如果(value.Integer!=null)
{
serializer.Serialize(writer,value.Integer.value);
返回;
}
if(value.String!=null)
{
serializer.Serialize(writer,value.String);
返回;
}
抛出新异常();
}
public static readonly ValueConverter Singleton=new ValueConverter();
}

您有一个具有两个属性的类
运算符
规则
,您想再次将这两个变量添加到第二个属性?`Yes@Train。规则[]中还有三个属性,我正在通过JObject手动添加它们。例如:JObject.add(“字段”,每个条件[0]);JObject.add(“条件“,每个条件[2]);jObject.Add(“value”,每个条件[1]);你能给我们看看你所有的代码吗?@Train更新了这个问题。感谢你必须实现递归。可能是递归调用方法,你必须在其中复制属性。无论出现多少次,它都会不断添加变量规则。不是很有用。”(
public partial class StackOverFlow
{
    [JsonProperty("payLoad")]
    public PayLoad PayLoad { get; set; }
}

public partial class PayLoad
{
    [JsonProperty("DataSetCommonQuery")]
    public DataSetCommonQuery DataSetCommonQuery { get; set; }
}

public partial class DataSetCommonQuery
{
    [JsonProperty("operator")]
    public string Operator { get; set; }

    [JsonProperty("rules")]
    public DataSetCommonQueryRule[] Rules { get; set; }
}

public partial class DataSetCommonQueryRule
{
    [JsonProperty("field", NullValueHandling = NullValueHandling.Ignore)]
    public string Field { get; set; }

    [JsonProperty("condition", NullValueHandling = NullValueHandling.Ignore)]
    public string Condition { get; set; }

    [JsonProperty("value", NullValueHandling = NullValueHandling.Ignore)]
    public string Value { get; set; }

    [JsonProperty("operator", NullValueHandling = NullValueHandling.Ignore)]
    public string Operator { get; set; }

    [JsonProperty("rules", NullValueHandling = NullValueHandling.Ignore)]
    public RuleRule[] Rules { get; set; }
}

public partial class RuleRule
{
    [JsonProperty("field")]
    public string Field { get; set; }

    [JsonProperty("condition")]
    public string Condition { get; set; }

    [JsonProperty("value")]
    public Value Value { get; set; }
}

public partial struct Value
{
    public long? Integer;
    public string String;

    public static implicit operator Value(long Integer) => new Value { Integer = Integer };
    public static implicit operator Value(string String) => new Value { String = String };
}

internal static class Converter
{
    public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
        DateParseHandling = DateParseHandling.None,
        Converters =
        {
            ValueConverter.Singleton,
            new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
        },
    };
}

internal class ValueConverter : JsonConverter
{
    public override bool CanConvert(Type t) => t == typeof(Value) || t == typeof(Value?);

    public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
    {
        switch (reader.TokenType)
        {
            case JsonToken.Integer:
                var integerValue = serializer.Deserialize<long>(reader);
                return new Value { Integer = integerValue };
            case JsonToken.String:
            case JsonToken.Date:
                var stringValue = serializer.Deserialize<string>(reader);
                return new Value { String = stringValue };
        }
        throw new Exception();
    }

    public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
    {
        var value = (Value)untypedValue;
        if (value.Integer != null)
        {
            serializer.Serialize(writer, value.Integer.Value);
            return;
        }
        if (value.String != null)
        {
            serializer.Serialize(writer, value.String);
            return;
        }
        throw new Exception();
    }

    public static readonly ValueConverter Singleton = new ValueConverter();
}