Обнаружен неожиданный символ при анализе значения: { - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь проанализировать некоторый JSON с Newtonsoft.JSON.JsonConvert.DeserializeObject - на самом деле JSON был также сгенерирован Newtonsoft из тех же классов, в которые я пытаюсь десериализоваться, и, безусловно, действителен.

Но это даетменя исключение: Newtonsoft.Json.JsonReaderException : Unexpected character encountered while parsing value: {.

Я сделал очень упрощенный пример, чтобы показать проблему.

Вот JSON:

{
  "address": {
    "country": {
      "name": "UK"
    }
  }
}

Вот упрощенныймодель, которая все еще показывает проблему:

public class Person
{
    public Address Address;
}

public class Address
{
    public Country Country;

    public Address(string country)
    {
    }
}

public class Country
{
    public string Name;
}

Вот код, который не работает:

// Fails with Newtonsoft.Json.JsonReaderException : "Unexpected character encountered
// while parsing value: {. Path 'address.country', line 3, position 16."
Person item = JsonConvert.DeserializeObject<Person>(json);

Я проверил, и это не та же проблема, что и C # - При синтаксическом анализе значения обнаружен неожиданный символ: {.Путь '[0] .Statistics или При синтаксическом анализе ответа API обнаружен неожиданный символ.Теперь я решил проблему (см. Мой ответ ниже), и это НЕ та же проблема или решение, что и у любого из этих двух.

1 Ответ

0 голосов
/ 22 мая 2019

Этот короткий ответ: убедитесь, что класс, соответствующий непосредственному родителю пути, о котором сообщается о проблеме (путь 'address.country' в приведенном выше сообщении об исключении; его непосредственный родитель 'address'), имеет открытый конструктор без параметров.

Итак, в приведенном выше примере вы должны добавить общедоступный конструктор без параметров к вашему Address классу.


Вот класс Address из примера с некоторыми комментариями, объясняющими, что происходит:

public class Address
{
    public Country Country;

    // With this present the JSON parses just fine!
    public Address() { }

    // Because both of the following were true:
    //  1) the name of a parameter here matches the name of a field to be populated and
    //  2) there was no public parameterless constructor
    // this was constraining what could appear in the JSON to populate "address"!
    public Address(string country)
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...