如何避免替换“_x0020_”的空间?

时间:2014-08-18 13:14:39

标签: c# wcf

我正在使用WCF,我的一些方法返回一个类,当转换为JSON时,生成如下对象:

{
    "__type": "Data:#MyNamespace.Model"
    "Dado_x0020_1": "1"
    "Dado_x0020_2": "2"
    "Dado_x0020_3": "3"
}

我可以清楚地记得它以前不是这样的,WCF不会替换" _x0020 _"的空格字符。问题是我不知道我的代码中发生了什么变化才能实现这一点。我不记得改变任何导致这种情况的配置。有什么想法吗?

这是我班级的代码。它只是一种允许具有可变属性名称和计数的对象的方法:

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace MyNamespace.Model
{
    [Serializable]
    public class Data : ISerializable
    {
        internal Dictionary<string, object> Attributes { get; set; }

        public Data()
        {
            Attributes = new Dictionary<string, object>();
        }

        protected Data(SerializationInfo info, StreamingContext context)
            : this()
        {
            SerializationInfoEnumerator e = info.GetEnumerator();
            while (e.MoveNext())
            {
                Attributes[e.Name] = e.Value;
            }
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            foreach (string key in Attributes.Keys)
            {
                info.AddValue(key, Attributes[key]);
            }
        }

        public void Add(string key, object value)
        {
            Attributes.Add(key, value);
        }

        public object this[string index]
        {
            set { Attributes[index] = value; }
            get
            {
                if (Attributes.ContainsKey(index))
                    return Attributes[index];
                else
                    return null;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

WCF的DataContractJsonSerializer添加了_x0020_个字符。你需要使用不同的json序列化器(如json.net),如果你想将输出用于其他东西然后进行WCF通信。

但是,如果你将Data课改为这样的话:

[DataContract]
public class Data
{
    public Data()
    {
        Attributes = new Dictionary<string, object>();
    }

    [DataMember]
    public Dictionary<string, object> Attributes { get; set; }

    [IgnoreDataMember]
    public object this[string index]
    {
        set { Attributes[index] = value; }
        get
        {
            if (Attributes.ContainsKey(index))
                return Attributes[index];
            else
                return null;
        }
    }
}

然后是以下WCF序列化:

class Program
{
    static void Main(string[] args)
    {
        var data = new Data();
        data["Dado 1"] = 1;
        data["Dado 2"] = 2;
        data["Dado 3"] = 3;

        var dcjs = new DataContractJsonSerializer(typeof(Data));
        MemoryStream stream1 = new MemoryStream();
        dcjs.WriteObject(stream1, data);
        stream1.Seek(0, SeekOrigin.Begin);
        var json3 = new StreamReader(stream1).ReadToEnd();
    }
}

会产生这样的结果:

{
  "Attributes": [
    {
      "Key": "Dado 1",
      "Value": 1
    },
    {
      "Key": "Dado 2",
      "Value": 2
    },
    {
      "Key": "Dado 3",
      "Value": 3
    }
  ]
}

但我仍然认为它不会在WCF上下文之外有多大用处。