2016-12-14 7 views
-1

Ich verwende die Json.Net Newtonsoft Komponente während meines Projekts bei der Arbeit.Newtonsoft Json.Net - Wie vermeidet man die Verwendung von Json-Eigenschaften?

Von Zeit zu Zeit stolpere ich in die Implementierungsdetails der Bibliothek. Wenn ich zum Beispiel den Wert der JProperty abrufe, muss ich die Eigenschaft .Value verwenden:

var displaySettings = options.DisplaySettings.Value;

Dies ist ärgerlich, da man sich daran erinnern muss, dass die Eigenschaften eines gegebenen dynamischen Objekts tatsächlich von der "Value" -Eigenschaft abgerufen werden können, ohne dessen Typ zur Laufzeit zu kennen. (Und zusätzlich gibt es mehr Linq-Code, um den "Wert" zu wählen, der den Code verstopft)

Gibt es eine Möglichkeit, das Json-Objekt einfach zu umbrechen oder vielleicht die Newtonsoft-Komponente richtiger zu verwenden?


Ich sehe, ich bin immer nach unten gestimmt, aber ich denke, es gibt ein Problem mit JObject Verkapselung ist.

Wenn ich "var" verwende, um die Bool-Variable zu speichern, würde der Test fehlschlagen, weil die Variable JValue-Objekt enthalten wird.

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

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

Dieser Test wird passieren: Wahre Aber war:

Erwartet:

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

Der Test in Folge wird

auch zu beweisen, auf dass dies nicht NUnit ist ausgabe:

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

var result = testee.TestBool; 

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

Das obige wird Ausnahme auf "wenn" -Klausel auslösen.

Ich frage mich, ob es bei stackoverflow eine gängige Praxis ist, Menschen zu stimmen, ohne nach einer Klärung zu fragen. Nette Kultur. (Ich kann nehmen, dass einige der Menschen neu zu bestimmten Technologie Fragen überhaupt zu fragen, entmutigt würden)

Danke, AD

+0

Sie können festlegen, stark typisierte Klassen und deserialisieren in denen anstelle der Verwendung dynamischer zu handhaben. –

Antwort

1

Deserialize in C# -Klassen.

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

Sie haben viele Möglichkeiten, die dynamische Werte mit 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) 
Verwandte Themen