Как преобразовать массив Json в список объектов в С#
У меня есть строка Json, как показано ниже
{
"JsonValues":{
"id": "MyID",
"values": {
"value1":{
"id": "100",
"diaplayName": "MyValue1"
},
"value2":{
"id": "200",
"diaplayName": "MyValue2"
}
}
}
}
Я хочу преобразовать строку Json в классы ниже
class ValueSet
{
[JsonProperty("id")]
public string id
{
get;
set;
}
[JsonProperty("values")]
public List<Value> values
{
get;
set;
}
}
class Value
{
public string id
{
get;
set;
}
public string DiaplayName
{
get;
set;
}
}
Мой код десериализации
JavaScriptSerializer js = new JavaScriptSerializer();
StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
string jsonString = sr.ReadToEnd();
var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);
Но после сериализации получаю нулевые значения. Как я могу это решить?
Ответы
Ответ 1
Как уже указывали другие, причина, по которой вы не получаете ожидаемых результатов, заключается в том, что ваш JSON не соответствует структуре класса, которую вы пытаетесь десериализовать. Вам либо нужно изменить JSON, либо изменить классы. Поскольку другие уже показали, как изменить JSON, я возьму здесь противоположный подход.
Чтобы соответствовать JSON, который вы опубликовали в своем вопросе, ваши классы должны быть определены следующим образом. Заметьте, что внесли следующие изменения:
- Я добавил класс
Wrapper
, соответствующий внешнему объекту в вашем JSON.
- Я изменил свойство
Values
класса ValueSet
с List<Value>
на Dictionary<string, Value>
, так как свойство Values
в вашем JSON содержит объект, а не массив.
- Я добавил несколько дополнительных атрибутов
[JsonProperty]
для соответствия именам свойств в ваших объектах JSON.
Определения классов:
class Wrapper
{
[JsonProperty("JsonValues")]
public ValueSet ValueSet { get; set; }
}
class ValueSet
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("values")]
public Dictionary<string, Value> Values { get; set; }
}
class Value
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("diaplayName")]
public string DisplayName { get; set; }
}
Вам нужно десериализовать класс Wrapper
, а не класс ValueSet
. Затем вы можете получить ValueSet
из Wrapper
.
var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
Вот рабочая программа для демонстрации:
class Program
{
static void Main(string[] args)
{
string jsonString = @"
{
""JsonValues"": {
""id"": ""MyID"",
""values"": {
""value1"": {
""id"": ""100"",
""diaplayName"": ""MyValue1""
},
""value2"": {
""id"": ""200"",
""diaplayName"": ""MyValue2""
}
}
}
}";
var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
Console.WriteLine("id: " + valueSet.Id);
foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
{
Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
}
}
}
И вот вывод:
id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2
Ответ 2
http://json2csharp.com/
Я нашел ссылку выше невероятно полезной, поскольку она исправила мои классы С#, вызвав их из JSON, который был фактически возвращен.
Затем я позвонил:
JsonConvert.DeserializeObject<RootObject>(jsonString);
и все работало, как ожидалось.
Ответ 3
Ваша структура данных и ваш JSON не совпадают.
Ваш JSON:
{
"JsonValues":{
"id": "MyID",
...
}
}
Но структура данных, которую вы пытаетесь выполнить сериализацией, такова:
class ValueSet
{
[JsonProperty("id")]
public string id
{
get;
set;
}
...
}
Вы пропустите шаг: ваш JSON - это класс, у которого есть одно свойство с именем JsonValues
, которое имеет объект вашей структуры данных ValueSet
как значение.
Также внутри вашего класса ваш JSON:
"values": { ... }
Ваша структура данных такова:
[JsonProperty("values")]
public List<Value> values
{
get;
set;
}
Обратите внимание, что { .. }
в JSON определяет объект, где as [ .. ]
определяет массив. Поэтому, согласно вашему JSON, у вас нет кучи значений, но у вас есть one
объект значений со свойствами value1
и value2
типа Value
.
Поскольку десериализатор ожидает массив, но вместо него получает объект, он выполняет наименее неразрушающую (исключение) вещь, которую он может сделать: пропустите значение. Свойство values
остается с его значением по умолчанию: null
.
Если вы можете: Отрегулируйте свой JSON. Следующее будет соответствовать вашей структуре данных и, скорее всего, вы действительно хотите:
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1"
}, {
"id": "200",
"diaplayName": "MyValue2"
}
]
}
Ответ 4
у вас есть непревзойденная строка jSon, если вы хотите конвертировать в список, попробуйте это
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1",
},
{
"id": "200",
"diaplayName": "MyValue2",
}
]
}
Ответ 5
Вы проверили, что эта строка работает отлично, и ваша строка имеет значение в ней?
string jsonString = sr.ReadToEnd();
если да, попробуйте этот код для последней строки:
ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);
или если у вас есть массив json, вы можете использовать следующий список:
List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);
удача
Ответ 6
Это тоже возможно:
using System.Web.Helpers;
var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);
Ответ 7
Вы можете использовать Json.Net framework для этого.
Точно так же:
Account account = JsonConvert.DeserializeObject<Account>(json);
домашняя страница: http://json.codeplex.com/
документ об этом: http://james.newtonking.com/json/help/index.html#