У меня есть документ JSON, и я пытаюсь извлечь отдельные данные из этого документа JSON. Однако, когда я пытаюсь извлечь, все, что я получаю, - это числа, которых нет в документах.
Вот документ:
user: [{
serialNo: 1,
details: [{ name: "John",
job: "Receptionist" }]
},
{
serialNo: 2,
details: [{
name: "Alan",
job: "Salesman"
}]
}
]
Итак, я попытался сделать это, чтобы извлечь имя «Алан».
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
var js = new JavaScriptSerializer();
var objText = reader.ReadToEnd();
var data = objText[1][0].name;
}
}
Все, что он возвращает мне, это какое-то число, которое не имеет смысла, например, «123» или «467» и т. д.
Преобразуйте свой json в C# и его легко извлечь.
взгляните на JSON.Net, а затем превратите его в POCO
@vishuminhas Я пробовал var data= (string)obj["user"]["serialNo"]; , но появляется сообщение об ошибке. Он говорит, что [ ] должен быть в int.
ваш json кажется недействительным, укажите правильный json
@vishumin имеет правильный json? это формат json, который я вижу, когда открываю его.





Взгляните на Json.NET - Newtonsoft. это пакет, который также можно найти с NuGet, просто набрав Newtonsoft :).
Затем вы можете сделать такую модель:
первое решение:
using Newtonsoft.Json;
using System;
namespace UsersJSON
{
public class UsersRepository
{
public User[] Users;
}
public class User
{
public int serialNo;
public string[] details;
}
class Program
{
static void Main(string[] args)
{
var json = @"{
users: [
{
serialNo: 1,
details: ['John', 'Receptionist']
},
{
serialNo: 2,
details: ['Alan', 'Salesman']
}]
}";
var usersList = JsonConvert.DeserializeObject<UsersRepository>(json);
Console.WriteLine(usersList.Users[0].details[0]); // prints "John"
Console.ReadLine();
}
}
}
второе решение:
using Newtonsoft.Json;
using System;
namespace UsersJSON
{
public class UsersRepository
{
public User[] Users;
}
public class User
{
public int serialNo;
public UserDetails details;
}
public class UserDetails
{
public string name;
public string job;
}
class Program
{
static void Main(string[] args)
{
var json = @"{
users: [
{
serialNo: 1,
details: {name: 'John', job: 'Receptionist'}
},
{
serialNo: 2,
details: {name: 'Alan', job:'Salesman'}
}]
}";
var usersList = JsonConvert.DeserializeObject<UsersRepository>(json);
Console.WriteLine(usersList.Users[0].details.name); // prints "John"
Console.ReadLine();
}
}
}
Оба требуют, чтобы вы немного изменили вывод JSON.
Привет, большое спасибо за предоставленные коды. Однако, когда я попытался сделать то же самое, я сделал отладку в части var usersList, я получил от нее нуль.
Код, который я изначально опубликовал, не был протестирован, но с тех пор я вернулся, чтобы взглянуть на код, и он заработал, но я потребовал, чтобы я изменил ваш JSON, поскольку строка, которую вы предоставили, фактически недействительна. Если вы посмотрите на мое теперь отредактированное решение, вы сможете увидеть, как выглядит действительный JSON :)
Если вы хотите иметь name: и job: в качестве аксессоров, вам нужно будет использовать нотацию {name: "name", job: "job"} вместо [], потому что нотация [] предназначена для массивов, а не объектов, а вы нельзя использовать: для определения средств доступа к элементам массива в JSON. Вы можете проверить, действителен ли ваш JSON, используя эту ссылку jsonviewer.stack.hu
Я опробовал RAW-строки моего JSON в предоставленном вами jsonviewer. Может быть отформатирован. Но я не уверен, почему в моих кодах я получаю нулевое значение, хотя я следую точным шагам .. хм
Поэтому я использовал предоставленный вами json и поставил {в начале и} в конце, чтобы увидеть, форматирует ли его программа просмотра, и это действительно так, Json.NET ожидает увидеть фигурные скобки «{}» вместо квадратных ». [] "когда внутри есть имена вроде name:" value ". Я могу еще раз отредактировать свой код, чтобы вы могли увидеть альтернативный способ структурировать свой JSON.
Также я только что заметил, что это правильный JSON, в нем просто отсутствует начало {и конец}, если вы хотите использовать второе решение, просто измените общедоступные детали UserDetails на общедоступные детали UserDetails []; и он должен работать так же, но вы просто получите доступ к нему через массив
@Arana, почему ты не можешь перейти по этой ссылке stackoverflow.com/questions/24233104/…