Newtonsoft json:将对象中的值序列化为字典 keyvaluepair

Newtonsoft json: serialize values in object as dictionary keyvaluepair

提问人:dododo 提问时间:11/11/2023 最后编辑:Peter Csaladododo 更新时间:11/12/2023 访问量:122

问:

我有一个匿名对象,例如:

string keyValue = "keyValue1";
var itemsArray = new [] { .. }

return new
{
   Key = keyValue,
   Items = itemsArray
}

我想通过Newtonsoft.Json(Json.NET)序列化为字符串。我使用默认的序列化配置,该配置为我提供如下输出:

{
  "Key": "keyValue1",
  "Items": [{ .. } , .. ]
}

这很好,但我希望格式略有不同(没有 c# 类中的字段名称):

{
  "keyValue1" : [{ .. } , .. ]
}

如果我创建一个带有单个项目的 c# 字典,其中 a 将是 - ,我可以做到这一点,但我希望有更好的方法(无需创建单项目字典)?keykeyValuevalueitemsArray

注意:如果匿名类使事情变得更容易,我可以将匿名类替换为常规类

C# 序列化 json.net

评论

0赞 Yong Shun 11/11/2023
嗨,您的序列化 JSON 是否有可能具有多个键值对?
0赞 Peter Csala 11/11/2023
你知道编译时吗?keyValue1
1赞 Denis Micheal 11/11/2023
"我希望有更好的方法(无需创建单项词典)?字典有什么问题?
0赞 dododo 11/11/2023
Do you know the keyValue1 at compile time- 不,它是来自不同对象的值
0赞 dododo 11/11/2023
whats wrong with dictionary?- KeyValuePair 没问题,但字典不是真的。我将进一步使用这种结构,并且一直调用看起来不是最好的方法.Single()

答:

1赞 Denis Micheal 11/11/2023 #1

可以使用 ExpandoObject

例:

var key = "keyValue1";
var itemsArray = new[] {"1","2","3" };

IDictionary<string, object> result = new ExpandoObject();
result[key] = itemsArray;

var json = JsonConvert.SerializeObject(result);
Console.WriteLine(json);

输出

{"keyValue1":["1","2","3"]}

没有接口标识符的替代方法:

ExpandoObject继承类,因此您可以向其添加属性,例如,该属性将具有一个对象数组,即 .ObjectkeyitemsArray

var itemsArray = new[] {"1","2",new object()};

//create expando object
dynamic result = new ExpandoObject();
result.key = itemsArray;

//serialize
var json = JsonConvert.SerializeObject(result);
Console.WriteLine(json);

//get values
var values = JsonConvert.DeserializeObject<ExpandoObject>(json);
//values.key allows you to access the contents of the object

输出:

{"key":["1","2",{}]}

评论

0赞 dododo 11/11/2023
这看起来和使用 Dictionary 一样,不是吗?
0赞 Denis Micheal 11/11/2023
ExpandoObject还实现了,如果你不想要字典,又想序列化多个。IEnumerable<KeyValuePair<String,Object>>KeyValuePair<String,Object>
0赞 dododo 11/11/2023
我想要有一个对象(不是集合)的关键点,即当我进一步使用这个节点时不需要一直调用.Single
0赞 Denis Micheal 11/12/2023
@dododo还继承了对象类,则可以使用属性和项的值进行定义ExpandoObjectkey
1赞 Serge 11/12/2023 #2

你可以在一行中制作它

var json = new JObject { [keyValue] = new JArray(itemsArray)}.ToString();