0

外部 Web サービスに送信する非常に長く複雑な JSON があります。
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: "" } }

2 番目のクラス構造を使用して、最初のような JSON を取得することは可能ですか?

4

1 に答える 1

2
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);
于 2013-09-06T13:49:34.653 に答える