使用json.net序列化过程中合并两个对象? [英] Merge two objects during serialization using json.net?
问题描述
我遇到下面的情况可能有人帮助我,如下实现?
I met a situation as below could anybody help me achieve as below?
For Example:
我有类,如下,
public class Sample
{
public String name{get;set;}
public MyClass myclass{get;set;}
}
我MYCLASS将如下:
My Myclass will be as follow:
public class MyClass
{
public String p1{get;set;}
public String p2{get;set;}
}
当我使用 Json.net
序列化类样品的对象,我有如下,它工作得很好。
When I am using Json.net
to serialize the object of the class Sample,I got as below and it works well.
{
"name":"...",
"myclass":
{
"p1":"...",
"p2":"..."
}
}
其正确的,但我有一个疑问是有可能得到JSON字符串如下?
Its correct but I have a doubt is it possible to get the json string as below?
{
"name":"...",
"p1":"...",
"p2":"..."
}
在此先感谢
马杜
推荐答案
您可以创建匿名对象和序列化:
You can create anonymous object and serialize it:
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"}
但我建议你你的示例
类的任何使用默认的序列化,或创建一个将被序列化到您的格式类(即移动 MyClass的
属性为示例
)。
But I suggest you either use default serialization of your Sample
class, or create class which will be serialized into your format (i.e. move MyClass
properties into Sample
).
更新:您可以使用自定义转换器,平坦对象序列化和所有内部的对象属性的顶层对象的属性:
UPDATE: You can use custom converter, which flattens object and serializes all inner objects properties as top level object properties:
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());
或者你可以简单地隐藏匿名类型创建成自定义转换器,如果需要此行为一类只:
Or you can simply hide anonymous type creation into custom converter, if you need this behavior for one type only:
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);
}
}
这篇关于使用json.net序列化过程中合并两个对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!