创建一个类来构建一个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();
}