- 已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。
这个问题似乎与help center中定义的范围内的编程无关。
昨天关门了。
Improve this question
我把一个. Net包从Framework转换到Core,并尝试使用System.Text.Json而不是Newtonsoft,但效果不太好。所以,我保留了Newtonsoft JsonConvert,直到我更新了所有的NuGet包,一切都很好。我遇到了一些奇怪的问题,发现一些json没有像以前那样被反序列化。我调用这个方法:
public static dynamic StringToObject(string jsonString)
{
return JsonConvert.DeserializeObject<dynamic>(jsonString);
}
将其作为jsonString:
{
"id": "854e469f-76ec-4036-b10e-2305d5063cc4",
"name": "Microsoft",
"cofounders": [{
"id": "0d61b68c-f05e-4e6c-822d-6769578f241c",
"name": "Bill Gates"
}, {
"id": "3ef95ce8-7302-470c-afc2-f59d2a3cb2df",
"name": "Paul Allen"
}],
"employees": [{
"id": "6416b2c8-9f8f-4a8e-9f74-ce919ee08a2f",
"fullName": "Jane Doe",
"anualSalary": 150000,
"position": {
"id": "b57fe795-0fbf-4da8-bab8-c6a2ba4e709d",
"description": "Engineer Manager"
},
"benefits": [{
"id": "e3257cb7-0984-42c1-b432-d640dfb0a029",
"additional": 3000,
"description": "Additional Bonus"
}, {
"id": "7cda860a-695b-4aac-956a-fb7245c75ef3",
"additional": 2500,
"description": "Paid Vacation"
}]
}]
}
我检查了调试器,现在一切都很好,我可以引用o ["id"]. ToString()并得到正确的值,但是,当它从方法返回到调用代码行时,我在调试器中输入了相同的内容,并得到了以下错误:
CS0021: Cannot apply indexing with [] to an expression of type 'object'
好的,我知道它是反序列化到动态的(会改变,但不能/不会使用POCO,所以请跳过评论,相信我).所以,切换到Newtonsoft并使用JsonObject和JsonNode,我尝试了一个简单的json字符串,与我有一些数组或对象作为子:
[{
"org_int": "151",
"org_name": "Learn.net, Inc.",
"org_short": "Eterna",
"web_address": "https://server.learn.net/LMW",
"PortServer": "server.learn.net",
"DataCommIP": "localhost:7260",
"theme": "151"
}]
我尝试了System.Text.Json,utf8json,fastjson ...我尝试了各种不同的组合...太多了,我甚至不能在这里列出它们...主要是因为在所有更改之后我没有代码了。我最近尝试的是Newtonsoft使用JsonObject和JObject,结果类似。
o =连接对象.解析(jsonString);
StringToObject: Newtonsoft.Json.JsonReaderException: Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray
在这一点上,我迷路了。我只想知道:
1.与. Net Core一起使用的最佳json包是什么
1.应使用该包的哪一部分来序列化/反序列化if选项
1.应该使用什么类型的对象来反序列化为
编辑:
如果不清楚的话,Newtonsoft曾经能够对这两个json示例进行序列化和反序列化,它没有区分包含数组的字符串和不包含数组的字符串。如果json中有数组,JObject似乎会阻塞,如果试图向对象添加任何内容,JArray会失败。
1条答案
按热度按时间siotufzp1#
Newtonsoft.Json有两种解析方式- JObject.Parse和JArray. Parse。对于您的最后一个json,您需要JArray. Parse。这就是为什么您会收到错误“... item is not an object”的原因。这将正常工作
我相信聪明的人喜欢学习,而愚蠢的人喜欢教学。所以我不会回答你的1,2,3个问题。恕我直言,Text.Json除了演示“Hello,World”之外什么都不好,所以我总是使用Newtonsoft.Json。
更新
如果你不知道你的json字符串是什么类型的,恕我直言,最简单的方法是这样的代码(如果需要,你可以使用trim)
这两种情况下都可以使用JToken.Parse,但在此之后,通常需要在任何情况下定义类型