【问题标题】:DataContract framework not working when serializing objects to JSON将对象序列化为 JSON 时,DataContract 框架不起作用
【发布时间】:2017-06-27 10:44:07
【问题描述】:

这是我的模型:

namespace RESTalm
{
    [DataContract]
    [KnownType(typeof(Entity))]
    [KnownType(typeof(Field))]
    [KnownType(typeof(Value))]
    public class Entities
    {
        [DataMember(IsRequired = true)]
        public List<Entity> entities;

        [DataMember(IsRequired = true)]
        public int TotalResults;
    }

    [DataContract]
    [KnownType(typeof(Field))]
    [KnownType(typeof(Value))]
    public class Entity
    {
        [DataMember(IsRequired = true)]
        public Field[] Fields;

        [DataMember(IsRequired = true)]
        public String Type;
    }

    [DataContract]
    [KnownType(typeof(Value))]
    public class Field
    {
        [DataMember(IsRequired = true)]
        public String Name;

        [DataMember(IsRequired = true)]
        public Value[] values;
    }

    [DataContract]
    [KnownType(typeof(Value))]
    public class Value
    {
        [DataMember(IsRequired = true)]
        public String value;
    }    
}

这是我的程序:

        private String toJSON(Object poco)
        {
            String json;
            DataContractJsonSerializer jsonParser = new DataContractJsonSerializer(poco.GetType());
            MemoryStream buffer = new MemoryStream();

            jsonParser.WriteObject(buffer, poco);
            StreamReader reader = new StreamReader(buffer);
            json = reader.ReadToEnd();
            reader.Close();
            buffer.Close();

            return json;
    }

当对象jsonParser 初始化时,它似乎根本无法识别我的模型。 这导致空的MemoryStream()。 请帮忙。

附:我在我的程序中删除了异常处理,因为它会分散注意力。谢谢。 此外,目前对象poco 始终被假定为我模型中的一种类型。

【问题讨论】:

  • 是的;它们都在同一个命名空间中,并且拥有所有需要的引用。
  • 您似乎需要通过重置其Position 将流倒回到开头,然后才能从中读取。
  • @dbc 你真是个天才,我爱你。

标签: c# asp.net json datacontract


【解决方案1】:

您需要通过重置其Position 将流倒回到开头,然后才能从中读取,例如:

public static string ToJson<T>(T obj, DataContractJsonSerializer serializer = null)
{
    serializer = serializer ?? new DataContractJsonSerializer(obj == null ? typeof(T) : obj.GetType());
    using (var memory = new MemoryStream())
    {
        serializer.WriteObject(memory, obj);
        memory.Seek(0, SeekOrigin.Begin);
        using (var reader = new StreamReader(memory))
        {
            return reader.ReadToEnd();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多