2017-05-25 4 views
1

Ich versuche, Newtonsoft.json zu verwenden, um eine Assembly von JSON-Dateien zu deserialisieren. Ich habe meine C# -Klassen entsprechend dem Schema, das großartig funktioniert. Wenn ich alle meine JSON-Dateien in einem zusammenfasse, deserialisiert es ohne Probleme, aber ich möchte einige lesbare Dateien haben. Um das zu tun, habe ich sie in mehreren Dateien getrennt.Deserialize mehrere JSON-Dateien

Wenn ich das tue, auch mit einer Verbindung zwischen ihnen, Newtonsoft.json kann nicht ein vollständiges Modell mit dem entsprechenden Schema erstellen.

Zum Beispiel, ich habe die unter C# -Klassen in Anwendung und DataModel wie unten:

class Application 
{ 
    [JsonProperty("dataModel", NullValueHandling = NullValueHandling.Ignore)] 
    public DataModel dataModel { get; set; } 
} 

class DataModel 
{ 
    [JsonProperty("id", Required = Required.Always)] 
    public String id { get; set; } 
} 

und mein json deserialisiert ist:

  • application.json:

    { 
        "dataModel": {"$ref":"data.json"} 
    } 
    
  • data.json:

    { 
        "$id": "dataModel", 
        "id": "dataModel", 
    } 
    

ich führen Sie den Code-Zeile deserialisieren:

JsonConvert.DeserializeObject(File.ReadAllText(@"application.json"), 
    new JsonSerializerSettings { 
    PreserveReferencesHandling = PreserveReferencesHandling.None, 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
}); 

Danach habe ich nur überprüfen, ob meine Anwendung eine DataModel haben, aber ich erhalte eine Ausnahme, die mir sagen, dass DataModel null ist .

Ich weiß nicht, ob das Problem ist, weil Newtonsoft kann nicht die Verbindung zwischen einfachen JSON-Datei oder wenn es etwas anderes ist. Ein bisschen Hilfe ist willkommen :-)

+0

Was passiert eigentlich, wenn Sie es versuchen? – Abion47

+0

Newtonsoft kann Ihre JSON-Datei nicht deserialisieren, da sie nicht gültig ist. Json https://jsonlint.com/ –

+0

Insbesondere ist der JSON der zweiten Datei aufgrund des zusätzlichen Kommas am Ende des zweiten "dataModel" ungültig. – Abion47

Antwort

0

Ich war nicht in der Lage, eine richtige Lösung für Ihr Problem zu finden. In der Zwischenzeit können Sie möglicherweise einen Workaround in Form eines benutzerdefinierten Konverters durchführen.

Ihre Klassen:

class Application 
{ 
    public DataModel dataModel { get; set; } 
} 

[JsonConverter(typeof(DataModelConverter))] 
class DataModel 
{ 
    public String id { get; set; } 
} 

DataModelConverter.cs

class DataModelConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DataModel); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jobj = JObject.Load(reader); 

     if (jobj["$ref"] != null) 
     { 
      string path = jobj["$ref"].Value<string>(); 
      string json = File.ReadAllText(path); 
      return JsonConvert.DeserializeObject<DataModel>(json); 
     } 

     var model = new DataModel 
     { 
      id = jobj.Value<string>("id") 
     }; 

     return model; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var model = value as DataModel; 

     string path = "data.json"; 
     string json = $"{{\r\n\t\"$id\" : \"{model.id}\",\r\n\t\"id\" : \"{model.id}\"\r\n}}"; 
     File.WriteAllText(path, json); 

     writer.WriteStartObject(); 
     writer.WritePropertyName("$ref"); 
     serializer.Serialize(writer, path); 
     writer.WriteEndObject(); 
    } 
} 
+0

Vielen Dank @ Abion47, es funktioniert gut. – kadben

0

das ist einfach. Alles, was Sie brauchen, ist eine Wrapper-Klasse. so etwas wie dieses:

class Wrapper 
{ 
    class Application 
    { 
     [JsonProperty("dataModel", NullValueHandling = NullValueHandling.Ignore)] 
     public DataModel dataModel { get; set; } 
    } 

    class DataModel 
    { 
     [JsonProperty("id", Required = Required.Always)] 
     public String id { get; set; } 
    } 
} 

dann versuchen Sie dies:

JsonConvert.DeserializeObject("{"+File.ReadAllText(@"application.json")+"}", 
    new JsonSerializerSettings { 
    PreserveReferencesHandling = PreserveReferencesHandling.None, 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
}); 
+0

Wenn ich Ihre Lösung versuchen, erhalte ich und Ausnahme: Newtonsoft.Json.JsonReaderException: ‚Ungültige Eigenschaft Bezeichnerzeichen: {. Pfad '', Zeile 1, Position 1 ' – kadben

0

Nachdem die Dateien in einem einzigen Objekt verschmelzen, jetzt die Referenzen arbeitet. Ich denke also, dass es nicht möglich ist, Referenzen mit JsonConvert aufzulösen.