2013-06-05 42 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

相關問題