2016-12-14 2 views
-1

Я использую компонент Json.Net Newtonsoft во всем моем проекте на работе.Newtonsoft Json.Net - Как избежать использования свойств Json?

Время от времени я спотыкаюсь о деталях реализации библиотеки. Например, когда я извлекаю значение JProperty, я вынужден использовать свойство .Value:

var displaySettings = options.DisplaySettings.Value;

Это раздражает, так как нужно помнить, что свойства данного динамического объекта могут быть действительно получены с помощью свойства «Значение», не зная его тип во время выполнения. (И, кроме того, есть еще один код linq для выбора «Значение», которое загромождает код)

Есть ли способ легко обернуть объект Json или, возможно, использовать компонент Newtonsoft более правильным образом?


Я вижу, что у меня проголосовали, но я думаю, что существует проблема с инкапсуляцией JObject.

Если я использую «var» для хранения переменной bool, тест завершится неудачно, потому что переменная будет содержать объект JValue.

[Test] 
public void TestProperties() 
{ 
    dynamic testee = JsonConvert.DeserializeObject(@" 
    { 
     TestBool:true 
    } 
    "); 
    var result = testee.TestBool; 

    Assert.That(result, Is.EqualTo(true)); 
} 

Этот тест будет проходить:

Assert.That(result.Value, Is.EqualTo(true)); 

Испытание приведет:

Ожидаемое: Истинную Но было:

Кроме того, чтобы доказать, что это не NUnit выпуск:

dynamic testee = JsonConvert.DeserializeObject(@" 
{ 
    TestBool:true 
} 
"); 

var result = testee.TestBool; 

if (result) 
{ 
    Assert.Pass(); 
    return; 
} 

Вышеизложенное исключает исключение из предложения «if».

Интересно, является ли обычная практика для stackoverflow, чтобы проголосовать за людей, не прося разъяснений. Хорошая культура. (Я могу взять, что некоторые из новых людей к данной технологии будет обескуражены задавать вопросы на всех)

Спасибо, AD

+0

Вы можете задать строго типизированные классы и десериализации в те вместо того, чтобы использовать динамический. –

ответ

1

десериализацию в классы C#.

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @"{ ""FirstName"":""Bob"" }"; 

     Person person = Newtonsoft.Json.JsonConvert.DeserializeObject<Person>(json); 

     Console.WriteLine(person.FirstName); 
    } 

    public class Person 
    { 
     public string FirstName { get; set; } 
    } 
} 

http://www.newtonsoft.com/json/help/html/deserializeobject.htm

1

У вас есть много вариантов, чтобы обработать динамические значения с Json.NET

dynamic jobj = JObject.FromObject(new { DisplaySettings = "aaa" }); 

var ds1 = jobj.DisplaySettings; //ds1 is JValue 
var ds2 = jobj.DisplaySettings.Value; //ds2 is object (boxed string) 
var ds3 = (string)jobj.DisplaySettings; //ds3 is string (explicit casting) 
string ds4 = jobj.DisplaySettings; //ds4 is string (implicit casting) 
Смежные вопросы