【问题标题】:JavaScriptSerializer How to Deserialize an identifier with spaceJavaScriptSerializer 如何反序列化带有空格的标识符
【发布时间】:2013-06-17 14:50:51
【问题描述】:

我遇到的问题与此处https://stackoverflow.com/questions/12565464/javascriptserializer-deserialize-an-identifier-with-space 描述的完全相同,但没有人回答我会再试一次,

别人创建的API,形式为

[{"AdvertId":"1234567","Price Original":"500","Sold":"False"}]

应用程序已经使用 JavascriptSerilalization 来填充许多其他 API 上的命名属性,所以真的不想改变它,但是我保存这些数据的类不能有一个带有空格的属性“原始价格”,并且这个不能删除或替换为 _ 或其他东西。有没有可以调用的方法将字符串翻译成不同的东西?

是否有任何解决方案或者我必须使用 JSON.net 来反序列化,是我阅读的 DataContracts 上的一些内容,这些可能会有所帮助,但我似乎无法找到如何获得这个为我的代码工作,如果不调查这条路径,我很高兴知道这是可能的。

在此先感谢

示例类

Class Sample
{
    public int AdvertId { get; set; }
    public string Price Original { get; set; }
    public bool Sold { get; set; }
}

【问题讨论】:

  • 您是否尝试过在 .NET 中创建此类? AFAIK 像这样的类的解决方案根本无法编译。
  • 一种解决方案是编写自己的 JavascriptConverterClass msdn.microsoft.com/en-us/library/… 并在反序列化期间通过删除或替换为下划线来处理空间场景。
  • 您好 Alex 是的,我知道该类将无法编译,这只是突出显示问题的“原始价格”属性的示例......好吧,看看 evasilchenko ty :)

标签: c# .net json api javascriptserializer


【解决方案1】:

您仍然可以使用内置类型,但您需要使用 DataContractJsonSerializer 而不是 JavaScriptSerializer,并添加适当的 DataContractDataMember 属性 - 实现有点不同,但仍然很简单。

有一件事 - 你的 Sold 属性是布尔值,但你的 JSON 样本有一个字符串 - 布尔值是有效的 JSON 类型,所以你可以删除引号。

一些工作代码:

JSON:

[{"AdvertId":"1234567","Price Original":"500","Sold":false}]

C#:

var ser = new DataContractJsonSerializer(typeof(Sample[]));
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(JSON))) {
    Sample[] s = (Sample[])ser.ReadObject(ms);
}

[DataContract]
public class Sample {
    [DataMember]
    public int AdvertId { get; set; }

    [DataMember(Name = "Price Original")]
    public string PriceOriginal { get; set; }

    [DataMember]
    public bool Sold { get; set; }
}

【讨论】:

  • 优秀的乔,到目前为止,这看起来已经成功了,所以谢谢你指出我正确的方向:)
猜你喜欢
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多