Json序列化对象数据类型问题

时间:2016-01-04 05:10:27

标签: c# wpf serialization json.net

我正在研究WPF应用程序。在此应用程序中,我们具有“同步”功能。也就是说,用户可以将LOCAL状态同步到服务器,或者从SERVER同步LOCAL状态。

状态文件的当前结构如下

[Serializable]
public class State
{
    [XmlAttribute("Priority")]
    public int Priority { get; set; }

    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlElement("Auto")]
    [XmlElementAttribute("AMPMConstriants", typeof(AMPMConstriants))]
    [XmlElementAttribute("CxDays", typeof(CxDays))]

    public object Object { get; set; }



}

“XmlAttribute”的目的是,我们使用xmlSerialization将状态对象本地保存为文件。

为了同步目的,我们使用NewtonSOft.Json将状态对象转换为“json”字符串。 您可以看到我们正在使用数据类型“Object”,这是因为我们需要将不同类型的对象保存到同一个对象中。那就是“对象”值可能是“AMPMConstraints”类型,也可能是CxDays类型。

但问题是当我们序列化状态对象没有为“对象”数据类型正确序列化时。 所以当我们反序列化json字符串时,我们自然没有得到“Object”的值。

我们已经研究过这个问题并找到了一个像添加“JsonSerializerSettings”的解决方案。您可以在下图中看到它。

 private static string JsonObjectToStringSerializer<T>(T t)
        {
            string result = string.Empty;
            var jsonSerializerSettings = new JsonSerializerSettings()
            {
                TypeNameHandling = TypeNameHandling.Auto,

            };
            result = JsonConvert.SerializeObject(t,  jsonSerializerSettings);

            return result;

        }

此解决方案工作正常,现在我们能够将状态对象序列化为json字符串并将json字符串反序列化为状态对象。 但我们仍然面临着与名称空间相关的问题。

enter image description here

以上是序列化时生成的json字符串。您可以看到它显示完整的命名空间。 如何从此json字符串中删除全名空间。

请注意我使用的是TypeNameHandling = TypeNameHandling.Auto,

以下是AMPMConstraints和CXDays的类结构

 [Serializable]
    public class AMPMConstriants
    {
        [XmlAttribute("AM")]
        public bool AM { get; set; }
        [XmlAttribute("PM")]
        public bool PM { get; set; }

    }
   [Serializable]
    public class CxDays
    {
        [XmlAttribute("IsSun")]
        public bool IsSun { get; set; }

        [XmlAttribute("IsMon")]
        public bool IsMon { get; set; }

        [XmlAttribute("IsTue")]
        public bool IsTue { get; set; }

        [XmlAttribute("IsWed")]
        public bool IsWed { get; set; }

        [XmlAttribute("IsThu")]
        public bool IsThu { get; set; }

        [XmlAttribute("IsFri")]
        public bool IsFri { get; set; }

        [XmlAttribute("IsSat")]
        public bool IsSat { get; set; }
    }

我们坚持这个问题。如果您对此问题有任何疑问,请告诉我们。这对我们很有帮助。

由于

0 个答案:

没有答案