Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同一级别上的Json.NET序列化属性_C#_Json_Json.net - Fatal编程技术网

C# 同一级别上的Json.NET序列化属性

C# 同一级别上的Json.NET序列化属性,c#,json,json.net,C#,Json,Json.net,我有一个非常长且复杂的JSON要发送到外部web服务。 JSON具有相同级别的所有属性: public class Request { [JsonProperty(PropertyName = "prop1a")] public string Prop1A; [JsonProperty(PropertyName = "prop2a")] public string Prop2A; [JsonPropert

我有一个非常长且复杂的JSON要发送到外部web服务。
JSON具有相同级别的所有属性:

public class Request
{
    [JsonProperty(PropertyName = "prop1a")]
    public string Prop1A;

    [JsonProperty(PropertyName = "prop2a")]
    public string Prop2A;
    
    [JsonProperty(PropertyName = "prop3a")]
    public string Prop3A;
    
    [JsonProperty(PropertyName = "prop1b")]
    public string Prop1B;

    [JsonProperty(PropertyName = "prop2b")]
    public string Prop2B;
    
    [JsonProperty(PropertyName = "prop3b")]
    public string Prop3B;
    
    // [...]
}
生成的JSON:

// valid JSON
{ prop1a: "", prop2a: "", prop3a: "", prop1b: "", prop2b: "", prop3b: "" }
为了更好地工作,我在逻辑上将类似的属性划分为更小的类:

public class Request
{
    public AggregatedPropsA MyAggregatedPropsA;
    
    public AggregatedPropsB MyAggregatedPropsB;
}

public class AggregatedPropsA
{
    [JsonProperty(PropertyName = "prop1a")]
    public string Prop1A;

    [JsonProperty(PropertyName = "prop2a")]
    public string Prop2A;
    
    [JsonProperty(PropertyName = "prop3a")]
    public string Prop3A;
}
问题是json字符串现在是无效字符串,因为属性在不同级别上序列化:

// invalid JSON
{ MyAggregatedPropsA: { prop1a: "", prop2a: "", prop3a: ""}, MyAggregatedPropsB: { prop1b: "", prop2b: "", prop3b: "" } }
是否可以使用第二个类结构获得与第一个类类似的JSON?

var obj = new { x = new { a = 1, b = 2 }, y = new { c = 3, d = 4 } }; Func<JToken, IEnumerable<JProperty>> flatten = null; flatten = token => token.Concat(token.SelectMany(t => t.Children().SelectMany(y => flatten(y)))) .OfType<JProperty>() .Where(p => p.Value is JValue || p.Value is JArray); var dict = flatten(JToken.FromObject(obj)) .ToDictionary(p => p.Name, p => p.Value); var json = JsonConvert.SerializeObject(dict); Func flatte=null; flant=token=>token.Concat(token.SelectMany(t=>t.Children().SelectMany(y=>flant(y))) 第()类 其中(p=>p.Value为JValue | | p.Value为JArray); var dict=展平(JToken.FromObject(obj)) .ToDictionary(p=>p.Name,p=>p.Value); var json=JsonConvert.SerializeObject(dict);
Thank I4V的可能重复,不幸的是,此方法不太灵活,不允许我区分不同的属性。最好有一个属性来标记需要展平的属性。@StockBreak如果您解释了问题中不清楚的
flexible
部分,我可以发布另一个选项。我想您误解了我的评论。当然,我已经测试了您的解决方案(它是有效的),但它不适合,因为我的所有内部对象都将被展平(我有需要像往常一样嵌套的内部类)。正如我所说的,只要有一个属性就可以启用/禁用某些东西,这将是一件好事。谢谢@StockBreak这是我的最终报价:)