2016-06-09 75 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