2016-08-08 11 views
1

Ich versuche, C# LINQ zum Erstellen eines JObject zu verwenden. Ich weiß, dass ich eine Schleife verwenden kann, wie z. B.Verwenden von Linq zum Konvertieren von KeyValue-Paaren in Newtonsoft.Json.Linq.JObject

Ist es möglich, die Schleife mit LINQ zu ersetzen? Ich versuchte dies,

var data = fieldList.Select(field => new KeyValuePair<string, JValue>(field.Name, new JValue(field.Value))); 
var jobj = new JObject(data); 

aber es funktioniert nicht mit diesem Fehler:

Could not determine JSON object type for type System.Collections.Generic.KeyValuePair`2[ 
    System.String,Newtonsoft.Json.Linq.JValue]. 

Antwort

1

Hier

jobj[field.Name] = new JValue(field.Value); 

Sie fordern tatsächlich die folgende JObject Indexer:

public JToken this[string propertyName] { get; set; } 

heißt Sie die JObject Eigenschaft setzen.

So ist die LINQ Äquivalent wird so sein:

var data = fieldList.Select(field => new JProperty(field.Name, field.Value)); 
var jobj = new JObject(data); 
+1

Super !!! Das ist sehr hilfreich. Ich konnte auch ein 'Where()' vor dem 'Select()' hinzufügen, um nur die gewünschten Felder zu erhalten. –

1

Nun, ich weiß nicht, ob es ein schöner ist, aber man konnte verwenden Aggregate:

fieldList.Aggregate(new JObject(), (obj, next) => {obj[next.Name] = new JValue(next.Value); return obj;}) 

Es wäre schön, wenn JObject eine kettenfähige API hätte, aber das scheint es nicht zu sein.

+0

Ich stelle fest, sollte ich diesen Code eigentlich nicht testen ... Aber das Prinzip sollte gültig ist. Es scheint, als ob Sie versuchen, eine "Reduktion" zu machen (nehmen Sie eine Liste und reduzieren Sie sie auf einen einzigen Wert: JObject). –

Verwandte Themen