【问题标题】:ServiceStack.Text how to serialize class to JSonServiceStack.Text 如何将类序列化为 JSON
【发布时间】:2012-10-28 11:37:33
【问题描述】:

刚刚下载了 ServiceStack.Text 以在我的 ASP.NET 中使用它。我有许多属性的类,并希望将其中的五个(字符串、整数、二进制)序列化为 JSON。任何人都可以发布如何从我的班级创建 JSON 对象的简单示例吗?

【问题讨论】:

  • Import 需要注意,虽然您在导入时需要 using ServiceStack;,但 ToJson 方法不仅需要对 ServiceStack 的引用,还需要在项目中引用 ServiceStack.Text。

标签: c# json servicestack


【解决方案1】:

ServiceStack 默认会反序列化 POCO 的所有公共属性。

如果您只想序列化几个属性,那么您想用 [DataContract]、[DataMember] 属性来装饰您的类(与使用 MS DataContractJsonSerializer 的方式相同),例如:

[DataContract]
public class MyClass
{
    public string WillNotSerializeString { get; set; }

    [DataMember]
    public string WillSerializeString { get; set; }

    [DataMember]
    public int WillSerializeInt { get; set; }

    [DataMember]
    public byte[] WillSerializeByteArray { get; set; }
}

然后你可以使用 JsonSerializer 上的静态实用方法来(反)序列化它,或者更简洁的扩展方法,例如:

var dto = new MyClass { WillSerializeString = "some text" };
string json = dto.ToJson();
MyClass fromJson = json.FromJson<MyClass>();

编辑:

正如@Noah 提到的(来自 cmets),您还可以使用 [IgnoreDataMember] 属性来排除单个属性。

【讨论】:

  • 类似地,如果你希望你的所有属性序列化除了一个,你可以用[IgnoreDataMember]装饰那个属性,但是你不应该用[DataContract]装饰这个类在这种情况下,否则它将无法按预期工作。我刚刚在一个项目中使用 ServiceStack 做到了这一点,很高兴看到它奏效了。
  • 并注意:序列化/反序列化所有公共 >propertiesfields
  • @Quandary 对,你需要设置JsConfig.IncludePublicFields = true;来序列化公共字段,见:stackoverflow.com/a/15372520/85785
【解决方案2】:

您可以在自定义类上使用[Serializable()] 属性,然后:

JavaScriptSerializer serializer = new JavaScriptSerializer();

var Json = serializer.Serialize(myObject);

要忽略您正在序列化的对象中的特定属性,只需将[NonSerialized] 属性放在它们上面。

更新:

鉴于您想使用 ServiceStack 进行序列化,ServiceStack 网站提供了以下示例:

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json);

来源:http://www.servicestack.net/mythz_blog/?p=344

【讨论】:

  • 我不想使用 Microsoft 序列化程序,因为它很慢。我问一下ServiceStack.Text
  • 如果您对 ServiceStack.Text 特别感兴趣,那么是什么阻止您下载他们的示例项目并只是看看?
  • ServiceStack 网站甚至向您展示了如何使用它:servicestack.net/mythz_blog/?p=344
  • 我已经搜索了他们的网站并找到了您所指的示例。我不想序列化整个类,我想选择要序列化的属性并使用 ServiceStack.Text 构建我自己的 JSon 对象。
【解决方案3】:

servicestack 的测试证明,通过提供[DataContract][DataMember] 属性,您可以确定哪个正在被序列化,哪个没有被序列化。

测试:https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/DataContractTests.cs

测试对象:https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/Support/DdnDtos.cs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2020-07-19
    • 2023-03-21
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多