将未格式化的字符串(无效的json)转换为json

时间:2017-01-24 20:24:19

标签: c# json parsing

我有一个字符串,我可以从webservice看到这样的字符串:

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

这不是可解析的json。我想问一下除了将字符转换为字符以及纠正它们以将这些字符串转换为可解析的json之外是否还有其他方法:

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

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

对于每次更改,你都会运行一堆正则表达式替换。但是你需要捕获属性名称等等。性能会非常糟糕。

如果格式已知且可靠(例如集合/数组和子对象会发生什么)。并且服务提供商不提供客户端或SDK。那么你最好的办法是编写自己的解析器。从头开始创建自己的并不难。或者您可以使用像Irony.net或eto.parse这样的解析器库。这两个都允许你在c#中构造一个语法,所以它完全自包含,而不需要编译器编译器和生成的代码。还有一类称为“monadic”解析器的解析器,如Sprache,它们具有更简单的性质(一旦你绕过它们)。

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

然后你可以将整个地段包裹在MediaTypeFormatter中并通过HttpClient调用服务并获取对象。

答案 2 :(得分: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;
}