2017-05-10 6 views
-1

I aC# Objekt, dasObjekt zu verankern

{ 
    "LrsFeature": { 
    "MEASURE": 1.233242, 
    "STATION_ID": "brians station", 
    "NLF_ID": "brians route" 
    }, 
    "EVENT_ID": "00000000-0000-0000-0000-000000000000", 
} 

serialisiert nativ und ich möchte es

{ 
    "MEASURE": 1.233242, 
    "STATION_ID": "brians station", 
    "NLF_ID": "brians route", 
    "EVENT_ID": "00000000-0000-0000-0000-000000000000", 
} 

, wo alle Eigenschaften innerhalb LrsFeature sein werden im Root-Verzeichnis hinzugefügt .

Mein Versuch

  var events = JObject.FromObject(LrsEvent); 
      var attrs = JObject.FromObject(LrsEvent.LrsFeature); 

      events.Merge(attrs, new JsonMergeSettings 
      { 
       MergeArrayHandling = MergeArrayHandling.Union 
      }); 

Das gibt mir

{ 
    "MEASURE": 1.233242, 
    "STATION_ID": "brians station", 
    "NLF_ID": "brians route", 
    "LrsFeature": { 
    "MEASURE": 1.233242, 
    "STATION_ID": "brians station", 
    "NLF_ID": "brians route" 
    }, 
    "EVENT_ID": "00000000-0000-0000-0000-000000000000", 
} 

Ich brauche dann das LrsFeature Objekt zu löschen, aber es scheint ein wenig hacky. Ich dachte JSON.NET könnte eine direktere Methode haben, dies zu tun

+0

Bitte fügen Sie einen Code ein. Was hast du probiert? – Kyle

+1

Erstellen Sie ein anderes Modell –

+0

@Kyle done ..... – LearningJrDev

Antwort

1

Sie tun können, was Sie so wollen:

JObject jo = JObject.FromObject(LrsEvent); 
    JProperty lrs = jo.Property("LrsFeature"); 
    jo.Add(lrs.Value.Children<JProperty>()); 
    lrs.Remove(); 
    string json = jo.ToString(); 

Fiddle : https://dotnetfiddle.net/zsOQFE

1

Was Sie suchen, ist Deserialisieren eines JSON-String und dann tief-flatten es. Sie können dies tun, um die rekursive Methode:

-Code

public class JsonExtensions 
{ 
    /// <summary> 
    /// Deeply flattens a json object to a dictionary. 
    /// </summary> 
    /// <param name="jsonStr">The json string.</param> 
    /// <returns>The flattened json in dictionary kvp.</returns> 
    public static Dictionary<string, object> DeepFlatten(string jsonStr) 
    { 
     var dict = new Dictionary<string, object>(); 
     var token = JToken.Parse(jsonStr); 
     FillDictionaryFromJToken(dict, token, String.Empty); 
     return dict; 
    } 

    private static void FillDictionaryFromJToken(Dictionary<string, object> dict, JToken token, string prefix) 
    { 
     if(token.Type == JTokenType.Object) 
     { 
      foreach (var property in token.Children<JProperty>()) 
      { 
       FillDictionaryFromJToken(dict, property.Value, property.Name); 
       // Uncomment and replace if you'd like prefixed index 
       // FillDictionaryFromJToken(dict, value, Prefix(prefix, property.Name)); 
      } 
     } 
     else if(token.Type == JTokenType.Array) 
     { 
      var idx = 0; 
      foreach (var value in token.Children()) 
      { 
       FillDictionaryFromJToken(dict, value, String.Empty); 
       idx++; 
       // Uncomment and replace if you'd like prefixed index 
       // FillDictionaryFromJToken(dict, value, Prefix(prefix, idx.ToString())); 
      } 
     } 
     else // The base case 
     { 
      dict[prefix] = ((JValue)token).Value; // WARNING: will ignore duplicate keys if you don't use prefixing!!! 
     } 
    } 

    private static string Prefix(string prefix, string tokenName) 
    { 
     return String.IsNullOrEmpty(prefix) ? tokenName : $"{prefix}.{tokenName}"; 
    } 

} 

Nutzungs

var jsonStr = "{\"LrsFeature\":{\"MEASURE\":1.233242,\"STATION_ID\":\"brians station\",\"NLF_ID\":\"brians route\"},\"EVENT_ID\":\"00000000-0000-0000-0000-000000000000\"}"; 
var dict = JsonExtensions.DeepFlatten(jsonStr); 

foreach (var kvp in dict) 
    Console.WriteLine($"{kvp.Key}={kvp.Value}"); 
Verwandte Themen