convert Application Insights API call result to a Generic Dictionary Unterminated string. Expected delimiter

笑着哭i 提交于 2020-05-16 19:12:17

问题


I am using Application Insight to log CustomEvent. I would like querying it by code (c#). I found how to use the REST API, and using GET/Query to run a query and get the JSON result. I am trying to convert data using Proposed Answer now I am facing below issue while converting data to json from the below code. This issue occurred when I tried to get exceptions from API. Line in which I am getting the issue json2 = JsonConvert.DeserializeObject<List<dynamic>>(a.Trim()); below error I am getting:

Unterminated string. Expected delimiter: ". Path '[15]', line 1, position 2017.

static void Main(string[] args)
    {

        string URL =
    "https://api.applicationinsights.io/v1/apps/{0}/{1}";

        string apikey = "xxxxx";
        string appid = "xxxx";
        string query = "query?query=customEvents| where timestamp >ago(30d)| top 5 by timestamp";

        string result = "";

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Add("x-api-key", apikey);

        var req = string.Format(URL, appid, query);

        HttpResponseMessage response = client.GetAsync(req).Result;
        if (response.IsSuccessStatusCode)
        {
            result = response.Content.ReadAsStringAsync().Result;
        }
        else
        {
            result = response.ReasonPhrase;
        }

        //get the schema of the results, like how many columns and each columns' name
        string schema = result.Remove(0, result.IndexOf("\"columns\":") + 1);
        schema = schema.Remove(schema.IndexOf("],")).Remove(0, schema.IndexOf("["));
        schema = schema + "]";

        //define a dictionary for storing structured results
        Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();

        //convert schema string to json
        var json = JsonConvert.DeserializeObject<List<dynamic>>(schema);

        foreach (var item in json)
        {
            var t1 = ((JObject)item).First;
            var t2 = ((JObject)item).Last;

            string s1 = t1.ToString();

            List<string> list = new List<string>();
            dict.Add(s1.Replace("\"name\":", "").Trim(), list);
        }


        //add the value to the dictionary
        //format the string
        string new_content = result.Remove(0, result.IndexOf("\"rows\":[")).Replace("\"rows\":[", "").Replace("]}]}", "");

        //add each row of value to an array
        var row_array = new_content.Split(']');

        foreach (var t in row_array)
        {
            //if the row is empty, ignore it
            if (t.Length == 0) continue;

            int count = 0;
            string a = "";
            List<dynamic> json2 = null;

            if (t.StartsWith(","))
            {
                a = t.Remove(0, 1) + "]";
                json2 = JsonConvert.DeserializeObject<List<dynamic>>(a.Trim());
            }
            else if (!t.EndsWith("]"))
            {
                a = t + "]";

                json2 = JsonConvert.DeserializeObject<List<dynamic>>(a.Trim());
            }

            foreach (var item in json2)
            {
                var s2 = ((JValue)item).ToString();
                dict[dict.Keys.ElementAt(count)].Add(s2);
                count++;
            }
        }

        Console.WriteLine("---done---");
        Console.ReadLine();
    }

回答1:


I found a better solution for parsing the result from app insights api.

And the demo is here.

Please give it a try and let me know if you still need further help.



来源:https://stackoverflow.com/questions/61210921/convert-application-insights-api-call-result-to-a-generic-dictionary-unterminate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!