我正在使用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;
}
}
}
}
答案 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上下文之外有多大用处。