我正在使用JSON API。由于c#不接受-(减号)或。(点),我不得不用_(下划线)替换每个字符。当JSON响应作为字符串接收时,就会发生替换,这样每个属性名称都包含-或。将其替换为_,则每个属性名称都将与它将被反序列化到的类中的属性名称相同。
为了更清楚,这里有一些例子:
我收到以下JSON:{ "id": 1, "result": [ { "data": [ { "adm-pass": ""}]}
在我想反序列化为的类中,我有这样的属性:public String adm_pass {get; set;}
因此,我将减号替换为下划线,以便NewtonSoft解析器可以相应地对其进行反序列化。
我的问题是,有时我会在JSON中得到一些负整数。因此,如果我在:{"beta" : -1}
中进行字符串替换,我会得到一个解析异常,因为-1(此处为整数)变为_1,无法正确反序列化并引发异常。
有没有一种方法可以巧妙地替换字符串,这样我就可以避免这个错误?例如,如果-后面跟一个int,它就不会被替换。如果这种方式不存在,这类问题有解决方案吗?
Newtonsoft允许您指定JSON属性的确切名称,该属性将用于序列化/反序列化。所以你应该能够做这个
[JsonProperty("adm-pass")]
public String adm_pass { get; set; }
这样,您就不会被限制为将属性命名为JSON属性名称。在您的情况下,您不需要进行字符串替换。
希望这能有所帮助。
您必须检查是否替换了键而不是值,也许可以使用类似的regexhttp://regexr.com/3d471
Regex可以按照wlalele的建议工作。
但我会创建一个这样的新对象:
-
创建一个新对象:
var sharpObj = {};
-
将对象作为属性循环,如下所述:遍历对象属性
for (var property in object) { if (object.hasOwnProperty(property)) { // do stuff } }
-
在//do stuff部分中,使用所需的字符串替换在sharpObj上创建一个属性,并将该属性设置为相同的值。
var cleanProperty = cleanPropertyName(property); sharpObj[cleanProperty] = orginalObject[property];
注意:我假设您可以找到cleanPropertyName()方法或类似方法。
-
对对象进行字符串化
var string = JSON.stringify(sharpObj);
您可以使用子字符串来检查下一个字符是否为整数,这可以很容易地适应您的代码,因为您已经找到了一个字符,因此您可以执行
int a;
if(int.TryParse(adm_pass.Substring(adm_pass.IndexOf("-") + 1,1),out a))
{
//Code if next character is an int
}
else
{
adm_pass = adm_pass.Replace("-","_");
}
这种代码可以循环,直到没有剩余的连字符/减号