Как десериализовать json ответ - PullRequest
0 голосов
/ 28 февраля 2020
[
    {
        "property1": "prop-00000001",
        "property2": "property2value1",
        "property3": {},
        "property4": [
            "Prop4-00000001",
            "Prop4-00000002"
        ]
    },
    {
        "property1": "prop-00000002",
        "property2": "property2value2",
        "property3": {},
        "property4": [
            "Prop4-00000003",
            "Prop4-00000004"
        ]
    }
]

Я собираюсь получить ответ json, как показано выше. Количество элементов может увеличиться, например, на данный момент их 2, оно может увеличиться на go в зависимости от количества записей в базе данных. Другой момент заключается в том, что значения для каждого свойства, показанного выше, всегда будут аналогичны приведенному выше формату.

Моя проблема в том, что когда я использую класс, как показано ниже, для приведения в десериализации ответа json, его не работает:

public class Class1
{
    [JsonProperty("Property1")]
    public string Property1 { get; set; }

    [JsonProperty("Property2")]
    public string Property2 { get; set; }

    [JsonProperty("Property3")]
    public string Property3 { get; set; }

    [JsonProperty("Property4")]
    public IList<string> Property4 { get; set; }
}

Когда я делаю:

var jsonResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<Class1>(Response.Content);

Исключение:

Сообщение об исключении: после анализа значения неожиданно встретился неожиданный символ: ". Путь 'property3', строка 1, позиция 60.

Это означает, что он не может игнорировать фигурные скобки, которые лежат в качестве значения для property3: т.е. {}.

Stacktrace:

   at Newtonsoft.Json.JsonTextReader.ParsePostValue(Boolean ignoreComments)
   at Newtonsoft.Json.JsonTextReader.Read()
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)

Как мне написать правильный C# класс или C# решение?

Ответы [ 2 ]

1 голос
/ 28 февраля 2020
  1. Property3 не является строкой. Его объект. Ваш ответ json показывает пустой объект ({}). Итак, определите класс как

    public class EmptyClass { // Add properties to this class based on your response. }

  2. Кроме того, имена ваших свойств и имена JsonProperty не совпадают с регистром ответов. Поэтому измените Class1, как показано ниже:

`

public class Class1
{
    // since your response json has camelCasing, you will need to define JsonProperty to represent camelCasing or just use public string property1 { get; set; } without any decoration.
    [JsonProperty("property1")]
    public string Property1 { get; set; }

    [JsonProperty("property2")]
    public string Property2 { get; set; }

    [JsonProperty("property3")]
    public EmptyClass Property3 { get; set; }

    [JsonProperty("property4")]
    public IList<string> Property4 { get; set; }
}
После исправления вышеупомянутых двух, поскольку ваш ответ json является коллекцией, вам также нужно будет десериализовать в коллекцию ( List ). Итак, не могли бы вы попробовать использовать var jsonResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Class1>>(Response.Content);.

Пожалуйста, оставьте свои наблюдения после внесения этих изменений.

0 голосов
/ 28 февраля 2020

Я могу порекомендовать вам сайт http://json2csharp.com. Там вы можете вставить свой ответ JSON, и сайт сгенерирует конструкцию класса на его основе.

Вот класс, который я создал на основе вашего JSON:

public class Property3
{
}

public class RootObject
{
    public string property1 { get; set; }
    public string property2 { get; set; }
    public Property3 property3 { get; set; }
    public List<string> property4 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...