我正在使用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,它就不会被替换。 如果这种方式不存在,是否有解决这类问题的方法?
答案 0 :(得分:4)
Newtonsoft允许您指定JSON属性的确切名称,它将用于序列化/反序列化。 所以你应该能够做到这一点
[JsonProperty("adm-pass")]
public String adm_pass { get; set; }
这样,您不必将您的属性命名为与JSON属性名称完全相同。在您的情况下,您不需要进行字符串替换。
希望这有帮助。
答案 1 :(得分:2)
您必须检查是否要更换密钥而不是值,可能是使用http://regexr.com/3d471等正则表达式
答案 2 :(得分:1)
但我会创建一个这样的新对象:
创建一个新对象:
var userDescription = (string)userDirectoryData.Properties["description"].Value;
if (userDescription.IndexOf("Contracted") > -1)
{
continue;
}
else
{
//Do Stuff here
}
将对象循环为此处所述的属性: https://msdn.microsoft.com/en-us/library/k8b1470s.aspx
var sharpObj = {};
在// do stuff部分中,使用所需的字符串替换在sharpObj上创建一个属性,并将该属性设置为相同的值。
for (var property in object) {
if (object.hasOwnProperty(property)) {
// do stuff
}
}
注意:我假设您可以找出cleanPropertyName()方法或类似方法。
对象进行字符串化
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("-","_");
}
这种代码可以循环,直到没有剩余的连字符/缩写