使用json.net在序列化期间合并两个对象?

我遇到了以下情况可以帮助我实现以下目标吗?

例如,如果我有这个类: –

public class Sample { public String name {get;set;} public MyClass myclass {get;set;} } 

我的Myclass将如下:

 public class MyClass { public String p1 {get;set;} public String p2 {get;set;} } 

当我使用Json.net来序列化Sample类的对象时,我得到如下,它运行良好。

 { "name":"...", "myclass": { "p1":"...", "p2":"..." } } 

它是正确的,但我想知道是否有可能得到如下的json字符串?

 { "name":"...", "p1":"...", "p2":"..." } 

您可以创建匿名对象并将其序列化:

 var sample = new Sample { name = "Bob", myclass = new MyClass { p1 = "x", p2 = "y" }}; string json = JsonConvert.SerializeObject(new { sample.name, sample.myclass.p1, sample.myclass.p2 }); 

结果

 {"name":"Bob","p1":"x","p2":"y"} 

但我建议您使用Sample类的默认序列化,或者创建将序列化为您的格式的类(即将MyClass属性移动到Sample )。

更新 :您可以使用自定义转换器,它将对象展平并将所有内部对象属性序列化为顶级对象属性:

 public class FlattenJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JToken t = JToken.FromObject(value); if (t.Type != JTokenType.Object) { t.WriteTo(writer); return; } JObject o = (JObject)t; writer.WriteStartObject(); WriteJson(writer, o); writer.WriteEndObject(); } private void WriteJson(JsonWriter writer, JObject value) { foreach (var p in value.Properties()) { if (p.Value is JObject) WriteJson(writer, (JObject)p.Value); else p.WriteTo(writer); } } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { return true; // works for any type } } 

用法:

 string json = JsonConvert.SerializeObject(sample, new FlattenJsonConverter()); 

或者,您只需将匿名类型创建隐藏到自定义转换器中,如果您只需要一种类型的此行为:

 public class SampleJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Sample sample = (Sample)value; JToken t = JToken.FromObject(new { sample.name, sample.myclass.p1, sample.myclass.p2 }); t.WriteTo(writer); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { return objectType == typeof(Sample); } }