使用Linq将KeyValue对转换为Newtonsoft.Json.Linq.JObject

时间:2016-08-08 17:41:53

标签: c# linq json.net

我正在尝试使用C#LINQ来构建一个JObject。我知道我可以使用循环,例如,

var jobj = new JObject();
foreach (var field in fieldList)
{
    jobj[field.Name] = new JValue(field.Value);
}

是否可以用LINQ替换循环?我试过这个,

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

但它失败并出现此错误:

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

2 个答案:

答案 0 :(得分:1)

嗯,我不知道它是否更漂亮,但你可以使用Aggregate:

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

如果JObject有一个可链接的API会很好,但它似乎不是。

答案 1 :(得分:1)

下面

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

您实际上是在调用以下JObject索引器:

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

即。您正在设置JObject属性。

所以LINQ等价物将是这样的:

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