2016-05-19 10 views
2

Ich verwende eine Funktion, um aus einer JSON-Datei zu lesen und eine Liste der Klasse auf der Benutzeroberfläche neu. Meine Klasse istJson lesen in C# Problem

public class UseCase 
    { 
     public string UseCaseId { get; set;} 
     public string UseCaseDescription { get; set;} 
    } 

Die Funktion wie dieses ist

List<UseCase> usecaseList = new List<UseCase>(); 
ReadUsecaseContentFronJsonFile1(); 
     usecaseList = UseCaseList(); 

The UseCaseList() ist

private List<UseCase> UseCaseList() 
     { 
      List<UseCase> usecaseList = new List<UseCase>(); 
      foreach (var value in deserializedData1.Values) 
      { 
       UseCase objUC = new UseCase(); 

       objUC.UseCaseId = value.UseCaseId; 
       objUC.UseCaseDescription = value.UseCaseDescription; 
       usecaseList.Add(objUC); 
      } 
      return usecaseList;//isSigRequired; 
     } 

private void ReadUsecaseContentFronJsonFile1() 
     { 
      deserializedData1 = ReadFromJsonFile1<Dictionary<string, UseCase>>(); 
     } 

Die Funktion von JSON-Datei zu lesen, ist wie folgt

protected static T ReadFromJsonFile1<T>() where T : new() 
     { 
      TextReader JsonReader = null; 
      try 
      { 
       var filePath = ConfigurationManager.AppSettings.Get("UsecaseListPath"); 
       if (File.Exists(filePath)) 
       { 
        JsonReader = new StreamReader(filePath); 
        var fileContents = JsonReader.ReadToEnd(); 
        return JsonConvert.DeserializeObject<T>(fileContents); 
       } 
       else 
       { 
        return new T(); 
       } 
      } 
      finally 
      { 
       if (JsonReader != null) 
        JsonReader.Close(); 
      } 
     } 

Ich bekomme nicht die JSON-Dateiwerte i n (deserializedData1). Was könnte das Problem sein?

Meine JSON-Datei ist:

{ 

    "UseCases": { 
     "UseCase": [{ 
      "UseCaseId": "CCS01", 
      "UseCaseDescription": "Add Device to CHF device log" 
     }, { 
      "UseCaseId": "CCS02", 
      "UseCaseDescription": "Remove device from CHF device log" 
     }, { 
      "UseCaseId": "CCS03", 
      "UseCaseDescription": "Restore CHF Device Log" 
     } 
} 

Antwort

0

Dies funktioniert:

static void Main(string[] args) 
{ 
    var fileName = @"c:\temp\test.json"; 
    var reader = new StreamReader(fileName); 
    var fileContent = reader.ReadToEnd(); 

    var useCases = JsonConvert.DeserializeObject<Dictionary<string, List<UseCase>>>(fileContent); 
    Console.WriteLine("Done."); 
} 

Sofern Ihre JSON werden dies geändert (wie in der früheren Post weist darauf hin):

{ 
    "UseCases": [{   
      "UseCaseId": "CCS01", 
      "UseCaseDescription": "Add Device to CHF device log" 
     }, { 
      "UseCaseId": "CCS02", 
      "UseCaseDescription": "Remove device from CHF device log" 
     }, { 
      "UseCaseId": "CCS03", 
      "UseCaseDescription": "Restore CHF Device Log" 
     }] 
} 
+0

ja bekomme ich die Listenwerte in usesCases.Aber wie konvertiert man es in die Liste ??? –

1

Schauen Sie am Anfang des Dokuments JSON:

{ 
    "UseCases": { 
     "UseCase": [{ 

Es sagt, dass Sie ein Root-Objekt haben, die ein Objekt enthält, die ein Objekt enthält, das enthält eine Liste;) oder mehr schön:

  1. Sie haben eine Wurzel Objekt
  2. Das Stammobjekt enthält ein Feld namens "UseCases", das ein Objekt ist.
  3. Das Feld "UseCases" enthält eine Eigenschaft "UseCase", die eine Sammlung

-Code ist:

// For the root object which contains the "UseCases" field 
public class RootObject 
{ 
    public UseCasesContainer UseCases { get; set; } 
} 

// For the "UsesCases" field, the tricky thing is that 
// it's not a collection but an object 
public class UseCasesContainer 
{ 

    // ..which contains a collection field. 
    public Collection<UsesCase> UsesCase { get; set; } 
} 

Die Sammlung selbst UseCase Objekte enthält, wie Sie angegeben haben.

So ist es deserialisieren Sie wie verwenden json.net können:

var rootObject = JsonConvert.DeserializeObject<RootObject>(yourJson); 

//don't be fooled by the property name, this is the collection 
var allUseCases = rootObject.UseCases.UseCase; 

Wenn Ihr JSON nur Use Cases Sie ein Dokument haben könnten geschaffen, ohne Felder enthalten:

[ 
     { 
      "UseCaseId": "CCS01", 
      "UseCaseDescription": "Add Device to CHF device log" 
     }, { 
      "UseCaseId": "CCS02", 
      "UseCaseDescription": "Remove device from CHF device log" 
     }, { 
      "UseCaseId": "CCS03", 
      "UseCaseDescription": "Restore CHF Device Log" 
     } 
] 

.. die nur deserialisiert könnte als:

var useCases = JsonConvert.DeserializeObject<IList<UseCase>>(json);