2013-06-05 50 views
1

我有一个复杂类型要序列化为字符串。我使用IXmlSerializable按照需要工作,现在我也试图让它为JSON消息工作。目前,我得到它通过DataContractSerializer的序列化到以下几点:将复杂类型序列化为简单类型JSON

<MyXmlRootElement>_value's contents</MyXmlRootElement> 

对于JSON输出我想只收到一个JSON字符串与_value的内容。

该类型实现了以下所述的更多功能,通过一些挂钩到我们的Web服务框架中的其他属性来影响生成的wsdl。所以生成的wsdl/xsd看起来都很棒,它只是没有给我所需的JSON。

我试图实现ISerializable的,这是否会影响产生的JSON,但它仍然把它放到一个复杂的(对象)型,即,{ "ValueKey": "_value's contents" }。任何想法如何让它序列化为纯字符串,没有大括号?

+0

您正在使用哪个'Json Serializer'? – haim770

+0

我们目前使用WebApi的默认序列化程序,对于JSON我相信它是JSON.NET序列化程序 – mhand

回答

2

该解决方案比预期的更容易。您可以用GlobalConfiguration注册JsonConverter。我做了一个关于JsonConverter的抽象包装,如下所示,这个想法来自以下SO线程:How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?

public abstract class CustomJsonConverter<T, TResult> : JsonConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // Load JObject from stream 
     JObject jObject = JObject.Load(reader); 

     // Create target object based on JObject 
     T target = Create(objectType, jObject); 

     // Populate the object properties 
     serializer.Populate(jObject.CreateReader(), target); 

     return target; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     T typedValued = (T)value; 
     TResult valueToSerialize = Convert(typedValued); 

     serializer.Serialize(writer, valueToSerialize); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof (T) == objectType; 
    } 

    protected virtual T Create(Type type, JObject jObject) 
    { 
     var simpleValue = jObject.Value<TResult>(); 
     return Convert(simpleValue); 
    } 

    protected abstract TResult Convert(T value); 
    protected abstract T Convert(TResult value); 
} 

然后,您可以用它来执行类似以下

public class DateTimeToStringJsonConverter : CustomJsonConverter<DateTime, string> 
{ 
    protected override string Convert(DateTime value) 
    { 
     return value.ToString(); 
    } 

    protected override DateTime Convert(string value) 
    { 
     return DateTime.Parse(value); 
    } 
} 

最后用GlobalConfiguration在Global.asax.cs中注册一个实例

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new DateTimeToStringJsonConverter()); 

任何想法/想法/意见?谢谢!

1

import this namespace System.Web.Script.Serialization;

string SerializeObject() 
{ 
    var objs = new List<Test>() 
    var objSerialized = new JavaScriptSerializer(); 
    return objSerialized .Serialize(objs); 
} 

我用作列表的示例,但您将使用您的对象。

+0

我想你错过了我想要的东西,我希望字符串返回为纯JSON字符串,而不是对象。做到上述将给予{“MyValueKey”:“MyValue”}',但我只想要返回字符串“_value” – mhand