Как я могу изменить свой JSON, чтобы я мог использовать его для заполнения сетки данных - PullRequest
0 голосов
/ 31 января 2019

Я получаю JSON, который не подходит для заполнения datagridview (я думаю).Я пытался использовать ответы, полученные при поиске, но мне так и не удалось решить эту проблему.

Вот как я получаю свой JSON.

 using (var client = new WebClient())
        {
            var values = new NameValueCollection();
            values["apikey"] = "my apikey";
            string destination = @"http://www.";
            var response = client.UploadValues(destination, values);
            string responseString = Encoding.Default.GetString(response);

И вот что я получаю обратно и помещаю в responseString.

{"error":"","return":{"key":"value","key":"value","key":"value"}}

И последний код для заполненияdatagridview.

var result = JsonConvert.DeserializeObject<List<JsonResult>>(responseString);
dataGridView1b.DataSource = result;

Когда я запускаю этот код, он заканчивается следующей ошибкой:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object 
(e.g. {"name":"value"}) into 
typeSystem.Collections.Generic.List`1[MarkkarteringMonitoring.JsonResult]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'error', line 1, position 9.'

Однако, если я использую код ниже, чтобы изменить JSON в "responseString "все работает, и сетка данных будет заполнена.

responseString = "[{\"key\":\"value\",\"key\":\"value\",\"key\":\"value\"}]";

Итак, как я могу автоматически изменить свой json и использовать его для заполнения моего массива данных.

1 Ответ

0 голосов
/ 31 января 2019

То, что Newtonsoft пытается вам сказать, это то, что он не может преобразовать ваш JSON Object в JSON Array.

. Как я вижу из вашего ответа Json, вы получаетеJSON string as:

{"error":"","return":{"key":"value","key":"value","key":"value"}}

Итак, в вашем коде на данный момент происходит 2 вещи:

  1. Строка, полученная в responseString, явно Object, а не Array.
  2. Свойства десериализуемой JsonResult находятся по ключу return в приведенной выше JSON String (, если я предположил, что правильный ) ..

Итак, мы можем разобрать строку в JObject ( с использованием расширения Newtonsoft.Json.Linq) и затем получить значение токена returnв строке и проанализируйте его для JsonResult Object / Array как.

var jobj = JsonConvert.DeserializeObject<JObject>(responseString);
var jsString = jobj["return "].ToString(); //here you have to make sure that the key name is specified correctly.
var token = JToken.Parse(jsString);
//now determine wither the recieved string is an object or an array
if (token is JArray)
{
     var results = token.ToObject<List<JsonResult>>();
     dataGridView1b.DataSource = results;
}
else if (token is JObject)
{
    var result = token.ToObject<JsonResult>();
    var results = new List<JsonResult>();
    results.Add(result);
    dataGridView1b.DataSource = results;
}        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...