巧妙地替换字符串

时间:2016-03-30 14:52:12

标签: c# json.net

我正在使用JSON API。因为c#不接受像 - (减号)或。 (点),我不得不用_(下划线)替换每个字符。当JSON响应作为字符串接收时,替换发生,以便每个属性名称包含 - 或a。将它替换为_,然后每个属性名称将与将被反序列化的类中的属性名称相同。

为了更清楚,这里有一些例子:

我收到以下JSON:{ "id": 1, "result": [ { "data": [ { "adm-pass": ""}]} 在我要反序列化的课程中,我有这个属性:public String adm_pass {get; set;}

所以我用下划线替换负号,以便NewtonSoft解析器可以相应地反序列化它。

我的问题是我有时会在JSON中得到一些负整数。因此,如果我在{"beta" : -1}中执行字符串替换,则会得到一个解析异常,因为-1(此处为整数)变为_1且无法正确反序列化并引发异常。

有没有办法聪明地替换字符串以便我可以避免这个错误? 例如,如果 - 后跟一个int,它就不会被替换。 如果这种方式不存在,是否有解决这类问题的方法?

4 个答案:

答案 0 :(得分:4)

Newtonsoft允许您指定JSON属性的确切名称,它将用于序列化/反序列化。 所以你应该能够做到这一点

[JsonProperty("adm-pass")]
public String adm_pass { get; set; }

这样,您不必将您的属性命名为与JSON属性名称完全相同。在您的情况下,您不需要进行字符串替换。

希望这有帮助。

答案 1 :(得分:2)

您必须检查是否要更换密钥而不是值,可能是使用http://regexr.com/3d471等正则表达式

答案 2 :(得分:1)

正如wlalele建议的那样,正则表达式可以发挥作用。

但我会创建一个这样的新对象:

  1. 创建一个新对象:

    var userDescription = (string)userDirectoryData.Properties["description"].Value;
    
    if (userDescription.IndexOf("Contracted") > -1)
    {
        continue;
    }
    else
    {
        //Do Stuff here
    }
    
  2. 将对象循环为此处所述的属性: https://msdn.microsoft.com/en-us/library/k8b1470s.aspx

    var sharpObj = {};
    
  3. 在// do stuff部分中,使用所需的字符串替换在sharpObj上创建一个属性,并将该属性设置为相同的值。

    for (var property in object) {
        if (object.hasOwnProperty(property)) {
            // do stuff
        }
    }
    
  4. 注意:我假设您可以找出cleanPropertyName()方法或类似方法。

    1. 对象进行字符串化

      var cleanProperty = cleanPropertyName(property);
      sharpObj[cleanProperty] = orginalObject[property];
      

答案 3 :(得分:0)

您可以使用子字符串来检查下一个字符是否为整数,这可以很容易地适应您的代码,因为您已经找到了一个字符,因此您可以这样做

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("-","_");
}

这种代码可以循环,直到没有剩余的连字符/缩写