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

本文关键字:Linq Newtonsoft Json JObject KeyValue 使用 转换 | 更新日期: 2023-09-27 18:01:33

我正在尝试使用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].

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

这里

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);

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

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

如果JObject有一个可链接的API就好了,但它似乎没有。