2016-03-30 73 views
0

我正在使用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

Newtonsoft一个正则表达式允许你指定的JSON属性,它将使用的确切名称序列化/反序列化。 所以,你应该能够做到这一点

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

你是不是仅限于完全按照JSON属性名命名的属性这样。在你的情况下,你不需要做一个字符串替换。

希望这会有所帮助。

+0

这很酷。我想知道微软的DataContractJsonSerializer是否有类似的东西。我看了一下,它有一种方法可以用[DataMember(Name =“user_id”)]来更改名称,但是我找不到它是否支持点(。)或破折号( - )。 – Rhyous

+0

非常感谢,这解决了整个问题。 –

+1

@Rhyous即使使用Microsoft的DataContractJsonSerializer,您也可以执行类似[DataMember(Name =“user-id”)]或[DataMember(Name =“user.id”)]的操作。这些支持 – Ferdin

2

你必须检查要更换的关键,而不是价值,也许通过使用像http://regexr.com/3d471

+0

如果我理解正确,我必须把'content = content.Replace(“ - \ D”,“_”);'。但是这不适合'c#'。 –

+0

您需要使用Regex.Replace()。 https://msdn.microsoft.com/en-us/library/xwewhkd1%28v=vs.110%29.aspx – M22an

1

正则表达式可以按照wlalele的建议工作。

不过,我想创建一个新的对象是这样的:这里所描述

var sharpObj = {}; 
  • 遍历对象作为属性:

    1. 创建一个新的对象 Iterate through object properties

      for (var property in object) { 
          if (object.hasOwnProperty(property)) { 
           // do stuff 
          } 
      } 
      
    2. 在// do stuff secti在sharpObj上用所需的字符串替换创建一个属性,并将该属性设置为相同的值。

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

    注:我认为你可以计算出cleanPropertyName()方法或相似。

    容易
  • 字符串化的对象

    var string = JSON.stringify(sharpObj); 
    
  • +0

    谢谢,但首先:这种方法将使服务器做更多的处理,其次:我已经有一个JSON字符串,我不想要创建另一个字符串,然后将其字符串化,第三:由于我的JSON具有更多属性,因此需要更多编码,而我不想那样做。 –

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

    这种代码可以循环,直到没有剩下的连字符/弊

    +0

    我想替换它们,而不是删除它们。如果我正确理解你的话。 –

    +0

    是的,在卷发里面,你可以做你的替换,我会编辑清晰 –