Les gars,

Je construis un objet JSON à partir d'une chaîne interpolée et je ne comprends pas comment fonctionne l'échappement. Je dois utiliser des guillemets doubles pour l'API.

Cela n'interpole pas les expressions entre les accolades:

@"{{
                        ""name"":""{taskName}"", 
                        ""products"": [    
                                    {""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}, 
                                    {""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}
                                  ], 
                        ""recurring"":true,
                        ""query"":    {
                                        ""date_from"": ""{dateFromString}"",
                                        ""date_to"": ""{dateToString}"",
                                        ""aoi"": {polygon}
                                    },
                        ""aoi_coverage_percentage"":90
                        }}";

Cela jette un tas d'erreurs - apparemment, les accolades ne sont pas correctement échappées:

$"{{
                        ""name"":""{taskName}"", 
                        ""products"": [    
                                    {""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}, 
                                    {""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}
                                  ], 
                        ""recurring"":true,
                        ""query"":    {
                                        ""date_from"": ""{dateFromString}"",
                                        ""date_to"": ""{dateToString}"",
                                        ""aoi"": {polygon}
                                    },
                        ""aoi_coverage_percentage"":90
                        }}";

Comment dois-je le formater afin de conserver les guillemets internes et les crochets externes tout en permettant l'interpolation des valeurs entre les crochets simples?

17
Boris K 26 avril 2017 à 16:42

3 réponses

Meilleure réponse

Il semble que vous ayez manqué l'échappement pour les objets products et query:

$@"{{
    ""name"":""{taskName}"",
    ""products"": [
        {{""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}},
        {{""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}}
    ],
    ""recurring"":true,
    ""query"": {{
        ""date_from"": ""{dateFromString}"",
        ""date_to"": ""{dateToString}"",
        ""aoi"": {polygon}
    }},
    ""aoi_coverage_percentage"":90
}}";
26
Uladzimir Palekh 26 avril 2017 à 13:46

En plus de @"..." et $"..." C # prend en charge les chaînes $@"...", c'est ce que vous recherchez lorsque vous créez des littéraux de chaîne multiligne qui doivent être interpolés:

$@"{{
    ""name"":""{taskName}"", 
    ""products"": [    
                {{""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}}, 
                {{""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}}
              ], 
    ""recurring"":true,
    ""query"":   {{
                    ""date_from"": ""{dateFromString}"",
                    ""date_to"": ""{dateToString}"",
                    ""aoi"": {polygon}
                }},
    ""aoi_coverage_percentage"":90
}}";
15
dasblinkenlight 26 avril 2017 à 14:26

Juste au cas où quelqu'un d'autre envisagerait de faire de même, il serait préférable de créer un type anonyme et de le sérialiser en json pour deux raisons:

  1. c'est beaucoup plus lisible et maintenable (combien de temps faudrait-il à quelqu'un pour changer le code parce que la structure json a changé tout en gardant tous les échappements dans l'ordre - surtout s'il n'y a pas de tests unitaires?)
  2. c'est beaucoup plus fiable (et si taskName a un guillemet double?)

Ci-dessous utilise json.net pour la sérialisation.

var jsonObj = new {
  name = taskName,
  products = new[] {
    new { product = "ndvi_image", actions = new [] { new { mapbox = "processed" } },
    new { product = "true_color", actions = new [] { new { mapbox = "processed" } }
  },
  recurring = true,
  query = new {
    date_from = dateFromString,
    date_to = dateToString,
    aoi = polygon
  },
  aoi_coverage_percentage = 90
};

var jsonString = JsonConvert.SerializeObject(jsonObj);
8
Igor Pashchuk 15 juil. 2019 à 01:22