2017-06-28 4 views
0

Je convertis certains fichiers CSV en JSON à l'aide de JsonOutputter. Dans les fichiers csv j'ai un champ contenant Json comme ceci (le caractère de pipe est délimiteur): ... | {"type": "Point", "coordonnées": [18.7726, 74.5091]} | ...Comment gérer le JSON interne lors de l'utilisation de JsonOutputter

Quand il est sortie JSON, le résultat ressemble à ceci: "Localisation": "{\" tapez \ ": \" point \ "\ "coordonnées \": [18,7726, 74,5091]}"

I voudrait se débarrasser des citations extérieures pour faire le Json ressembler à ceci: "Location": {"type": "Point", "coordonnées": [18.7726, 74.5091]}

Quelle est la meilleure façon pour y parvenir? La sortie Json sera stockée dans Cosmos DB, donc je suppose que le "nettoyage" du Json pourrait être fait soit en U-SQL ou en Cosmos DB?

Répondre

1

L'exemple de sortie génère uniquement un JSON plat. Comme nous n'avons pas de type de données JSON, toute valeur de chaîne doit être échappée pour être une valeur de chaîne. Vous pouvez écrire votre propre Outputter personnalisé qui prend par exemple des instances SqlMap pour des valeurs imbriquées et les afficher comme JSON imbriqué, ou - si vous savez que certaines chaînes dans les rowsets sont vraiment JSON et pas seulement des chaînes, sérialisez-les sans les citations

+0

Merci. J'ai mis à jour l'exemple JsonOutputter et sérialisé la colonne JSON en tant que JSON brut. –

0

Si JsonOutputter n'est pas le seul choix pour ce , nous pourrions convertir le fichier csv en Json avec notre code personnalisé. Je l'ai testé avec le fichier csv suivant.

number|Location 
1|{ "type":"Point", "coordinates":[ 13.7726, 73.5091 ] } 
2|{ "type":"Point", "coordinates":[ 14.7726, 74.5091 ] } 

Veuillez essayer d'utiliser le code suivant, il fonctionne correctement de mon côté.

var lines = File.ReadAllText(@"C:\Tom\tomtest.csv").Replace("\r", "").Split('\n'); 
      var csv = lines.Select(l => l.Split('|')).ToList(); 

      var headers = csv[0]; 
      var dicts = csv.Skip(1).Select(row => headers.Zip(row, Tuple.Create).ToDictionary(p => p.Item1, p => p.Item2)).ToArray().Select(x=>new 
      { 
       number = x["number"], 
       location = JObject.Parse(x["Location"]) 
      }); 

      string json = JsonConvert.SerializeObject(dicts); 
      Console.WriteLine(json); 

Résultat du test:

enter image description here