Wir arbeiten an einem Programm, um Slide-Image-Daten von einer Gruppe von Servern zu holen, die kein konsistentes Schema-Setup haben (ich mache mir Sorgen, dass es ungültig ist, aber ich bin nicht kompetent genug, um diesen Anruf zu machen). Wir haben keinen Einfluss auf die Server als unabhängige unabhängige Forscher.Effiziente Deserialisierung dynamischer JSON-Daten in Datentabelle
Die Daten wurden größtenteils (größtenteils) über eine große Anzahl von Formularen (n> 50) mit inkonsistenten Feldern (Daten gehen in die 90er Jahre zurück) eingegeben. Hier ist ein Beispiel für eine Antwort:
{
"form12873": [
{
"id": "9202075838",
"timestamp": "2015-06-25 10:24:51",
"user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit\/600.6.3 (KHTML, like Gecko) Version\/8.0.6 Safari\/600.6.3",
"remote_addr": "[Re.dact.ed]",
"processed": "1",
"data": {
"33885124": {
"field": "33885124",
"value": "CDat Lab",
"flat_value": "CDat Lab",
"label": "Completed by:",
"type": "select"
},
''**Several more fields as above**''...
"33884660": {
"field": "33884660",
"value": {
"slideX": "2456123",
"slideY": "456632",
"label": "K-20150322148",
"approved": "1",
"score": "30144"
},
"flat_value": "slideX = 2456123\nslideY = 456632\nlabel = K-20150322148\napproved = 1\nscore = 30144",
"label": "Slide Stats:",
"type": "slidestats"
},
''**Some of the fields are as above...
"31970564": {
"field": "31970564",
"value": [
"System",
"Crated",
"Mirax",
"NanoZoomer",
"ThinPrep",
"Aperio",
"Intellisite"
],
"flat_value": "System\nCrated\nMirax\nNanoZoomer\nThinPrep\nAperio\nIntellisite",
"label": "System Information",
"type": "checkbox"
},
''**Some of the values are Arrays...
"33883781": {
"field": "33883781",
"selection": "Retain",
"label": "4. Retain\/Remove\/Review",
"type": "selectdrop"
},
''**Some of the fields don't have the same children
"52792890": {
"field": "52792890",
"image": "'A really large byte[], removed for ease of reading'",
"type": "image"
}
''**Somewhere near the end of each response is the actual image...
}
},
{
"id": "33884681",
''**Then it continues on as above until the end:
}
], "total": 170, "pages": 5, "pretty_id": "478125624983" }
In der Vergangenheit, als ich habe zu model/class for the structure of the JSON der Lage gewesen, habe ich gewusst, wie sie damit umgehen (machen Sie eine Datenklasse mit Feld, Wert, usw. definiert).
Der Versuch, Lösungen wie:
var result = JsonConvert.DeserializeObject<List<Dictionary<string,
Dictionary<string, string>>>>(content);
immer führte zu Array Fehler oder Besetzungsausgaben (auch wenn direkte Abgüsse wurden hinzugefügt). Ich bin in der Lage die tatsächlichen first array using zu bekommen:
Public Shared Function Tabulate(json As String) As DataTable
Dim jsonLinq = Newtonsoft.Json.Linq.JObject.Parse(json)
' Find the first array using Linq
Dim srcArray = jsonLinq.Descendants().Where(Function(d) TypeOf d Is JArray).First()
Dim trgArray = New Newtonsoft.Json.Linq.JArray()
For Each row As JObject In srcArray.Children(Of JObject)()
Dim cleanRow = New JObject()
For Each column As JProperty In row.Properties()
' Only include JValue types
If TypeOf column.Value Is JValue Then
cleanRow.Add(column.Name, column.Value)
End If
Next
trgArray.Add(cleanRow)
Next
Return JsonConvert.DeserializeObject(Of DataTable)(trgArray.ToString())
End Function
Mein Endziel auch zu einer Datentabelle zu erhalten ist, und Looping/das Bild Byte hat ich besorgt über versucht, regressiv zu gehen, um weitere Kinder. Meine Versuche, dann mit dem ersten Array zu deserialisieren, sind dann auf Null gekommen.
Wenn es einen schnellen Weg gibt, damit umzugehen, würde ich die Lösung lieben. Wenn das Problem ist, dass ich versuche, mit JSON zu umgehen, würde ich gerne einen Hinweis darauf bekommen, wo der aktuelle Standard gebrochen wird (so kann ich zumindest versuchen, die andere Institution dazu zu bringen, ihre Server zu wechseln). Das heißt, ich werde mich wahrscheinlich sowieso damit beschäftigen müssen, auch wenn es Loops sind.
* Hinweis: Das Projekt wurde in VB.net gestartet, also haben wir es so gehalten, aber ich kann trotzdem entscheiden, auf C# zu portieren. Code in beiden wäre großartig.
Unten ist ein nicht markiertes Beispiel des Json, das zum Testen verwendet werden kann. Mein Endziel ist diese in eine Datentabelle zu glätten:
{
"form12873": [
{
"id": "9202075838",
"timestamp": "2015-06-25 10:24:51",
"user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit\/600.6.3 (KHTML, like Gecko) Version\/8.0.6 Safari\/600.6.3",
"remote_addr": "[Re.dact.ed]",
"processed": "1",
"data": {
"33885124": {
"field": "33885124",
"value": "CDat Lab",
"flat_value": "CDat Lab",
"label": "Completed by:",
"type": "select"
},
"33884660": {
"field": "33884660",
"value": {
"slideX": "2456123",
"slideY": "456632",
"label": "K-20150322148",
"approved": "1",
"score": "30144"
},
"flat_value": "slideX = 2456123\nslideY = 456632\nlabel = K-20150322148\napproved = 1\nscore = 30144",
"label": "Slide Stats:",
"type": "slidestats"
},
"31970564": {
"field": "31970564",
"value": [
"System",
"Crated",
"Mirax",
"NanoZoomer",
"ThinPrep",
"Aperio",
"Intellisite"
],
"flat_value": "System\nCrated\nMirax\nNanoZoomer\nThinPrep\nAperio\nIntellisite",
"label": "System Information",
"type": "checkbox"
},
"33883781": {
"field": "33883781",
"selection": "Retain",
"label": "4. Retain\/Remove\/Review",
"type": "select"
}
}
}
], "total": 170, "pages": 5, "pretty_id": "478125624983" }
vielleicht wird die akzeptierte Antwort hier helfen? http://stackoverflow.com/questions/947241/how-do-i-create-dynamic-properties-in-c – Muckeypuck
@Muckeypuck Würde das nicht nur funktionieren, wenn alle Kinder unter jedem Knoten einheitlich sind? IE die Elemente unter "Daten", die nicht die gleiche Anzahl/Arten von Eigenschaften hatten? Ich habe versucht, dynamische Eigenschaften zu implementieren, aber bis jetzt, als ich diese verknüpfte Lösung ausprobierte, bin ich bei der Deserialisierung immer noch gescheitert. Das mag an meinem mangelnden Verständnis liegen, also werde ich es weiter versuchen. –
Nach mehreren Ansätzen war die beste Lösung für mich, aus schlechten/unvorhersehbaren JSON-Daten zu lesen, es in ein 'JToken'-Objekt zu parsen und' .SelectTokens' und JSONPath zu verwenden, um herauszufinden, was ich brauchte oder ohne es zu entdecken mein Code stürzt dazwischen. Ist das eine Option für dich? – VBobCat