2017-01-24 58 views
1

我有一个字符串,我从一个Web服务,它看起来像这样得到:转换格式化字符串(不是有效的JSON),以JSON

({ 
id=1; 
name="myName"; 
position="5"; 
}) 

这不是一个可分析JSON。我想问问有没有除了要角色而和纠正他们的任何方式,以这样的字符串转换成一个可分析JSON是这样的:

{ 
"id":1, 
"name":"myName", 
"position":"5" 
} 
+0

哦,这还没有一个有效的JSON? –

+0

@AmitKumarGhosh不,它不是 – m0j1

回答

0

你冷运行一堆正则表达式替换每一个变化。但是,你需要捕捉财产名称等。表现将是可怕的。

如果格式已知且可靠(例如集合/数组和子对象发生了什么)。而服务提供商不提供客户端或SDK。那么你最好的选择是编写你自己的解析器。从头开始创建自己并不难。或者你可以使用Irony.net或eto.parse这样的解析器库。这两个都可以让你在c#中构造一个语法,因此它完全自包含而不需要编译器编译器和生成的代码。还有一类解析器叫做“monadic”解析器,比如Sprache,它们更简单一些(一旦你将头部缠绕在它们周围)。

无论采用哪种方法,您最终都会识别每个属性和对象边界,您可以在其中执行所需操作:设置属性;创建一个JToken;不管...

然后,你可以把整个地段包装在MediaTypeFormatter中,并通过HttpClient致电服务并获取对象。

0

最后我不得不写我自己的函数将其转换为可解析JSON,这里是我写的函数:

public string convertToJson(string mJson) 
{ 
    mJson = mJson.Replace("(","["); 
    mJson = mJson.Replace(")","]"); 
    string mJson2 = mJson.Trim('[',']'); 
    string[] modules = mJson2.Split(','); 
    for(int i = 0;i<modules.Length;i++) 
    { 
     Debug.Log("module["+i+"]: " + modules[i]); 
    } 
    for(int m=0;m<modules.Length;m++) 
    { 

     char[] mCharacter = {'{','}'}; 
     modules[m] = modules[m].Replace("{",string.Empty).Replace("}",string.Empty).Trim(); 
     Debug.Log("module["+m+"] after trim: " + modules[m]); 

     string[] items = modules[m].TrimEnd(';').Split(';'); 
     modules[m] = "{"; 
     for(int j=0;j<items.Length;j++) 
     { 
      Debug.Log("item["+j+"]: " + items[j]); 
      string[] keyValue = items[j].Split('='); 
      Debug.Log("key,value: " + keyValue[0] + ", " + keyValue[1]); 
      modules[m] = modules[m] + "\"" + keyValue[0].Trim() + "\":" + keyValue[1].Trim() + ","; 
     } 
     modules[m] = modules[m].Substring(0,modules[m].Length-1) + "}"; 
     Debug.Log("modules["+m+"] final: " + modules[m]); 
    } 
    string finalJson = "["; 
    for(int m=0;m<modules.Length;m++) 
    { 
     finalJson = finalJson + modules[m] + ","; 
    } 
    finalJson = finalJson.Substring(0,finalJson.Length-1) + "]"; 
    Debug.Log("finalJson: " + finalJson); 
    return finalJson; 
}