2

2 つの json 文字列を単一の dto にマージするメカニズムが servicestack.text にありますか?

ユースケースは、複数のソースからの複雑な設定を単一の設定ファイルにマージすることです

すなわち

{ "blah": { "params": { "default": "bar", "misc": "0", } } }

{ "blah": { "params": { "value": "val", "misc": "1", } } }

になる

{ "blah": { "params": { "default": "bar", "value": "val", "misc": "1", } } }

ありがとう

4

2 に答える 2

1

有効な JSON ではないため、末尾のコンマに注意してください。ただし、 ServiceStack の JSON シリアライザーの動的 API を使用してこれを行うことができます。

var json1 = "{\"blah\":{\"params\":{\"default\":\"bar\", \"misc\": \"0\" } } }";
var json2 = "{\"blah\":{\"params\":{\"value\":\"val\", \"misc\": \"1\" } } }";

var jsonObj = JsonObject.Parse(json1);
var jsonParams =jsonObj.Object("blah").Object("params");

foreach (var entry in JsonObject.Parse(json2).Object("blah").Object("params"))
{
    jsonParams[entry.Key] = entry.Value;
}

var to = new { blah = new { @params = jsonParams } };

to.ToJson().Print();

どちらが出力されますか:

{"blah":{"params":{"default":"bar","misc":"1","value":"val"}}}
于 2012-09-21T21:54:50.963 に答える
0

JsonArrays を使用しない場合は、上記のソリューションを再帰的に記述できます。

public static JsonObject Merge(JsonObject @this, JsonObject that) {
  foreach (var entry in that) {
    var exists = @this.ContainsKey (entry.Key);
    if (exists) {
      var otherThis = JsonObject.Parse(@this.GetUnescaped (entry.Key));
      var otherThat = JsonObject.Parse(that.GetUnescaped (entry.Key));
      @this [entry.Key] = Merge (otherThis, otherThat).ToJson ();
    } else {
      @this [entry.Key] = entry.Value;
    }
  }
  return @this;
}
于 2014-05-19T12:59:44.913 に答える