2016-11-19 8 views
0

Мой формат JSON похож -Чтение данных из массива JSon

{ 
"data": { 
    "translations": [ 
    { 
    "translatedText": "مرحبا" 
    } 
    ] 
} 
} 

я хочу прочитать переведенный текст значения без использования Json.NET. , но он всегда возвращает значение null.

JavaScriptSerializer ser = new JavaScriptSerializer(); 
      nameList myNames = ser.Deserialize<nameList>(json); 
+1

Что такое nameList выглядит как –

+0

public class nameList { общественное имя [] Переводчик {get; задавать; } } –

+0

Почему бы не использовать newtonsoft.json? – Phiter

ответ

1

класса {общественного списке имен общественности имя [] {Переводчик получить; задавать; }}

Это неправильный класс для сопоставления Json.


Попробуйте эти классы для десериализации JSON, и он будет работать прекрасно:

public class Translation 
{ 
    public string translatedText { get; set; } 
} 

public class Data 
{ 
    public List<Translation> translations { get; set; } 
} 

public class nameList 
{ 
    public Data data { get; set; } 
} 

Пример достижение для translatedText собственности:

var text = myNames.data.translations[0].translatedText; 
+0

отлично работает благодаря .... забыл упомянуть ранее –

+0

@AnoopMishra вы должны отметить ответ, как принято на тот случай, если он был ;-), и вас приветствует :-) – Jim

-1

основы nameList класса (от комментарии), что этот JSON преобразуется в, и образец JSON предоставил, причина, по которой возвращаемое значение равно null, равна Deserialize метод не может сопоставляться с классом.

Из предоставленной информации я воссоздал необходимые классы.

class nameList { 
    public name[] Translator { get; set; } 
} 

class name { 
    public string TranslatedText { get; set; } 
} 

Я тогда попытался разобрать предоставленный JSON в те классы, используя следующие

var serializer = new JavaScriptSerializer(); 
// The json data, in one line 
string json = "{\"data\":{\"translations\":[{\"translatedText\": \"مرحبا\"}]}}"; 

// Convert back into object similar to described 
nameList myNames = serializer.Deserialize<nameList>(json); 

try { 
    // Attempt to access 
    Console.WriteLine(myNames.Translator[0]); 
} 
catch (Exception ex) { 
    Console.WriteLine("Fail:" + ex.Message); 
} 

Об исполнении следующее выводилось на консоль.

Fail: Object reference not set to an instance of an object. 

Значение, равное нулю.

Как указано выше, это связано с тем, что метод Deserialize не может быть сопоставлен с классом. (хотя странно, что InvalidOperationException не запускался). Так что давайте посмотрим, что JSON может быть отображено путем преобразования экземпляра nameList.

// Manually created object 
nameList myNames = new nameList() { 
    Translator = new name[] { 
     new name() { TranslatedText = "مرحبا" } 
    } 
}; 

// Convert to JSON 
string json = serializer.Serialize(myNames); 
Console.WriteLine("JSON:\n" + json); 

При исполнении было выведено следующее.

JSON: 
{"Translator":[{"TranslatedText":"?????"}]} 

Помимо очевидного факта, что отлаживать консоль VSCode не поддерживает этот язык, мы столкнулись с некоторыми очень разные JSON.

Итак, давайте проанализируем это ...

{ "Translator": [ 
     { 
      "TranslatedText": "مرحبا" 
     } 
    ] 
} 
  1. Существует только два названные поля, по сравнению с 3 в образце JSON.
  2. 2 названных поля соответствуют свойствам в классах, я считаю, что это необходимо для класса JavaScriptSerializer, чтобы он правильно отображал значения. (Другие библиотеки, такие как JSON.net, имеют способы обойти это ограничение.)

Надеюсь, это помогло.

Смежные вопросы