2016-06-09 74 views
1

我正在嘗試創建類似以下的JSON以通過TCP傳遞給外部。如何序列化C#對象以生成特定的JSON

{"method": "dither", "params": [10, false, {"pixels": 1.5, "time": 8, "timeout": 40}], "id": 42}

我差點,但是這是我而不是:

{"method": "dither", "params": [10, false,"{"pixels": 1.5, "time": 8, "timeout": 40}"], "id": 42}

注意周圍的參數數組的第3元素引號。

我希望在解決這個問題上有任何幫助。這裏是我的代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 
using System.IO; 
using System.Collections; 
using System.Xml; 
using System.Reflection; 

namespace DitherTest 
{ 
    [CollectionDataContract] 
    public class DitherParametersList : ArrayList 
    { 
     public DitherParametersList() : base() 
     {} 
    } 

    [DataContract] 
    public class Dither 
    { 
     [DataMember(Name="method", Order=1)] 
     public string Method { get; set; } 

     [DataMember(Name="params", Order=2)] 
     public DitherParametersList Parameters { get; set; } 

     [DataMember(Name="id", Order=3)] 
     public int Id { get; set; } 
    } 

    [DataContract(Namespace="")] 
    public class Settle 
    { 
     [DataMember(Name = "pixels")] 
     public double Pixels { get; set; } 
     [DataMember(Name = "time")] 
     public int Time { get; set; } 
     [DataMember(Name = "timeout")] 
     public int Timeout { get; set; } 

     public string SerializeJson() 
     { 
      return this.ToJSON(); 
     } 
    } 

    static class Extensions 
    { 
     public static string ToJSON<T>(this T obj) where T : class 
     { 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
      using (MemoryStream stream = new MemoryStream()) 
      { 
       serializer.WriteObject(stream, obj); 
       return Encoding.Default.GetString(stream.ToArray()); 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      double ditherAmount = 10.0; 
      bool ditherRaOnly = false; 

      Settle settle = new Settle { Pixels = 1.5, Time = 8, Timeout = 40 }; 
      DitherParametersList parameterList = new DitherParametersList(); 
      parameterList.Add(ditherAmount); 
      parameterList.Add(ditherRaOnly); 
      string settleStr = settle.SerializeJson(); 
      parameterList.Add(settleStr); 

      Dither dither = new Dither { Method = "dither", Parameters = parameterList, Id=42 }; 

      string temp = dither.ToJSON(); 


     } 
    } 
} 

在此先感謝

+0

使用http://jsonlint.com/ – Sanket

+0

要基於JSON格式的C#類驗證您的JSON,你可以使用 - HTTP ://json2csharp.com/ – Sanket

+1

首先 - 在c#中使用json.net for json。多數民衆贊成現在在大多數地方使用 – pm100

回答

1

你告訴它做ARG字符串的三分之一。您將其序列化爲一個字符串,然後將其作爲參數粘貼。

你需要

parameterList.Add(settle); 
+0

他希望它是一個字符串。檢查他的問題。我懷疑他正在使用的解串器中存在一個錯誤。 –

+0

我的閱讀是,他希望它像問題中的第一行 – pm100

+0

不,我不認爲我希望它是一個字符串。這可能是爲什麼報價在那裏。 – user2102194

1

首先,一定要使用newtonsoft.com/json喜歡在他的評論中提到pm100。 我已經改變了你的代碼,以便將與newtonsoft.json工作,並得到了你問什麼了:

{"method": "dither", "params": [10, false, {"pixels": 1.5, "time": 8, "timeout": 40}], "id": 42} 

我刪除您所創建的DitherParametersList和使用這些模型:

public class Dither 
{ 
    [JsonProperty("method", Order = 1)] 
    public string Method { get; set; } 

    [JsonProperty("params", Order = 2)] 
    public ArrayList Parameters { get; set; } 

    [JsonProperty("id", Order = 3)] 
    public int Id { get; set; } 
} 

public class Settle 
{ 
    [JsonProperty("pixels")] 
    public double Pixels { get; set; } 

    [JsonProperty("time")] 
    public int Time { get; set; } 

    [JsonProperty("timeout")] 
    public int Timeout { get; set; } 
} 

,系列化他們很容易:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var settle = new Settle { Pixels = 1.5, Time = 8, Timeout = 40 }; 
     var parameterList = new ArrayList { 10, false, settle }; 
     var dither = new Dither { Method = "dither", Parameters = parameterList, Id = 42 }; 

     string temp = JsonConvert.SerializeObject(dither); 
    } 
} 
+0

所以我需要的不能用MS序列化器完成? – user2102194

+0

as will-ray said,you can trim the quotes: string settleStr = settle.SerializeJson()。Trim('''); 但是這絕對不是正確的路要走 – DeGoltz

+0

我同意,謝謝! – user2102194

0

的報價是從你在這裏做的第一序列來:

string settleStr = settle.SerializeJson(); 

假設你要避免使用Newtonsoft庫,立即解決將是簡單地修剪它們關閉:

string settleStr = settle.SerializeJson().Trim('"'); 

一個更強大的解決方案只需要系列化一次。如果您使用的List{string}代替DitherParamtersList的,你可以這樣做:

Settle settle = new Settle { Pixels = 1.5, Time = 8, Timeout = 40 }; 
var parameterList = new List<string>() 
{ 
    ditherAmount.ToString(), 
    ditherRaOnly.ToString(), 
    string.Join(",", settle.Pixels, settle.Time, settle.Timeout) 
}; 

Dither dither = new Dither { Method = "dither", Parameters = parameterList, Id = 42 }; 

string temp = dither.ToJSON(); 
+0

謝謝,我選擇了Newtonsoft庫...問題解決了。 – user2102194