将包含对象属性的poco序列化为Json

安德鲁·S

我有一类需要序列化才能传递给另一个系统。

该类包含一个定义为对象的属性,因为该对象将包含的类的类型在运行时可能会有所不同。

我的课程看起来像是这种简化的模型。

public class MyTestXML
{
    public string String1 { get; set; }
    public string String2 { get; set; }

    [System.Xml.Serialization.XmlElementAttribute("First", typeof(MyFirstObject),
                              Form = System.Xml.Schema.XmlSchemaForm.Qualified)]
    [System.Xml.Serialization.XmlElementAttribute("Second", typeof(MySecondObject),
                              Form = System.Xml.Schema.XmlSchemaForm.Qualified)]
    public object MyObject { get; set; }
}
public class MyFirstObject
{
    public string theFirstObjectString { get; set; }
}
public class MySecondObject
{
    public string theSecondObjectString { get; set; }
}

此类使用XmlElementAttribute和XmlSerializer完美地序列化为xml,但是当我尝试将其序列化为Json(使用Newtonsoft Json.Net)时,该对象是未定义的类型,因此无法反序列化。

有没有一种方法可以在序列化时在Json属性中指定XmlElementAttribute以获得相同的结果?

我想为序列化的对象提供Json的使用,因为它是xml大小的一半,但是除非我能解决对象属性问题的序列化,否则我不能。

提前致谢。

地堡心态

您将必须创建自己的自定义序列化行为。在这里看看这个答案:https : //stackoverflow.com/a/22722467/2039359关于如何为Json.Net实现自己的JsonConverter

在您的情况下,您可以执行以下操作来创建json

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            MyTestXML myTestXml = (MyTestXML) value;
            JObject jObject = JObject.FromObject(value);

            JProperty prop = jObject.Children<JProperty>().First(p=>p.Name.Contains("MyObject"));
            if (myTestXml.MyObject.GetType() == typeof (MyFirstObject))
            {
                prop.AddAfterSelf(new JProperty("First", JToken.FromObject(myTestXml.MyObject)));
                prop.Remove();
                jObject.WriteTo(writer);
            }
            else if (myTestXml.MyObject.GetType() == typeof (MySecondObject))
            {
                prop.AddAfterSelf(new JProperty("Second", JToken.FromObject(myTestXml.MyObject)));
                prop.Remove();
                jObject.WriteTo(writer);                    
            }
        }

反序列化时,类似这样

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JObject jo = JObject.Load(reader);

            MyTestXML myTestXml = new MyTestXML();

            serializer.Populate(jo.CreateReader(), myTestXml);

            object myObject = null;
            if (jo["First"] != null)
            {
                myObject = new MyFirstObject { TheFirstObjectString = jo["First"].SelectToken(@"TheFirstObjectString").Value<string>() };
            }

            if (jo["Second"] != null)
            {
                myObject = new MySecondObject { TheSecondObjectString = jo["Second"].SelectToken(@"TheSecondObjectString").Value<string>() };
            }

            myTestXml.MyObject = myObject;
            return myTestXml;
        }

要使用它,您将JsonConverter在序列化/反序列化时提供您的代码,如下所示:

        var settings = new JsonSerializerSettings();
        settings.Converters.Add(new MyTextXmlJsonConverter());
        var a = JsonConvert.SerializeObject(myTestXml, settings);

希望这就是您要寻找的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JSON.NET:将json字符串属性序列化为json对象

来自分类Dev

Jackson将JSON对象字段反序列化为单个列表属性

来自分类Dev

如何在不包括属性名称的情况下将匿名对象序列化为JSON

来自分类Dev

将工作正常的JavaScript对象序列化为仅保留属性的JSON?

来自分类Dev

序列化为JSON时如何将属性分组为子对象

来自分类Dev

将包含JodaTime对象的自定义对象序列化为JSON

来自分类Dev

将对象序列化为JSON,但仅包含具有[DataMember]属性的属性

来自分类Dev

将包含IList的对象序列化为XML

来自分类Dev

将JSON对象属性反序列化为字符串

来自分类Dev

GSON将多个属性序列化为子对象

来自分类Dev

Gson-将嵌套对象序列化为属性

来自分类Dev

如何将JSON反序列化为具有HashMap属性的对象?

来自分类Dev

将JSON反序列化为包含两个Dictionary属性的C#类

来自分类Dev

使用System.Text.Json将JSON反序列化为包含动态属性的类

来自分类Dev

通过属性名称以及JsonProperty将JSON反序列化为对象

来自分类Dev

您可以将集合包含的对象的一个属性序列化为JSON吗

来自分类Dev

将一属性对象的JSON数组反序列化为字符串集合

来自分类Dev

使用kotlinx.serialization将json对象的属性反序列化为String

来自分类Dev

序列化为JSON时如何将属性分组为子对象

来自分类Dev

将对象序列化为JSON,但仅包含具有[DataMember]属性的属性

来自分类Dev

将Django queryset序列化为JSON:获取AttributeError'tuple'对象没有属性'_meta'

来自分类Dev

将json文件反序列化为c#list <object>,但是属性不会进入对象

来自分类Dev

如何将包含不同数据类型的JSON数组反序列化为单个对象

来自分类Dev

将Json对象反序列化为.NET对象

来自分类Dev

将Json反序列化为带有包含空格的枚举的NJsonSchema生成的对象

来自分类Dev

将 JSON 反序列化为具有列表属性的对象

来自分类Dev

将 json 对象反序列化为 C# 对象

来自分类Dev

如何将属性序列化为 json 对象?

来自分类Dev

将 JSON 反序列化为包含格式化为字符串的 Point 值的多态对象的 .NET 集合

Related 相关文章

  1. 1

    JSON.NET:将json字符串属性序列化为json对象

  2. 2

    Jackson将JSON对象字段反序列化为单个列表属性

  3. 3

    如何在不包括属性名称的情况下将匿名对象序列化为JSON

  4. 4

    将工作正常的JavaScript对象序列化为仅保留属性的JSON?

  5. 5

    序列化为JSON时如何将属性分组为子对象

  6. 6

    将包含JodaTime对象的自定义对象序列化为JSON

  7. 7

    将对象序列化为JSON,但仅包含具有[DataMember]属性的属性

  8. 8

    将包含IList的对象序列化为XML

  9. 9

    将JSON对象属性反序列化为字符串

  10. 10

    GSON将多个属性序列化为子对象

  11. 11

    Gson-将嵌套对象序列化为属性

  12. 12

    如何将JSON反序列化为具有HashMap属性的对象?

  13. 13

    将JSON反序列化为包含两个Dictionary属性的C#类

  14. 14

    使用System.Text.Json将JSON反序列化为包含动态属性的类

  15. 15

    通过属性名称以及JsonProperty将JSON反序列化为对象

  16. 16

    您可以将集合包含的对象的一个属性序列化为JSON吗

  17. 17

    将一属性对象的JSON数组反序列化为字符串集合

  18. 18

    使用kotlinx.serialization将json对象的属性反序列化为String

  19. 19

    序列化为JSON时如何将属性分组为子对象

  20. 20

    将对象序列化为JSON,但仅包含具有[DataMember]属性的属性

  21. 21

    将Django queryset序列化为JSON:获取AttributeError'tuple'对象没有属性'_meta'

  22. 22

    将json文件反序列化为c#list <object>,但是属性不会进入对象

  23. 23

    如何将包含不同数据类型的JSON数组反序列化为单个对象

  24. 24

    将Json对象反序列化为.NET对象

  25. 25

    将Json反序列化为带有包含空格的枚举的NJsonSchema生成的对象

  26. 26

    将 JSON 反序列化为具有列表属性的对象

  27. 27

    将 json 对象反序列化为 C# 对象

  28. 28

    如何将属性序列化为 json 对象?

  29. 29

    将 JSON 反序列化为包含格式化为字符串的 Point 值的多态对象的 .NET 集合

热门标签

归档