C# .Net Core 6在更新所有NuGet包后突然出现json序列化/反序列化错误[已关闭]

fnatzsnv  于 2023-01-06  发布在  C#
关注(0)|答案(1)|浏览(156)

这个问题似乎与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会失败。

siotufzp

siotufzp1#

Newtonsoft.Json有两种解析方式- JObject.Parse和JArray. Parse。对于您的最后一个json,您需要JArray. Parse。这就是为什么您会收到错误“... item is not an object”的原因。这将正常工作

JArray a = JArray.Parse(jsonString);

我相信聪明的人喜欢学习,而愚蠢的人喜欢教学。所以我不会回答你的1,2,3个问题。恕我直言,Text.Json除了演示“Hello,World”之外什么都不好,所以我总是使用Newtonsoft.Json。
更新
如果你不知道你的json字符串是什么类型的,恕我直言,最简单的方法是这样的代码(如果需要,你可以使用trim)

JArray ja = null;
JObject jo = null;
if (json[0] == '{') jo= JObject.Parse(json) else  ja = JArray.Parse(json);

这两种情况下都可以使用JToken.Parse,但在此之后,通常需要在任何情况下定义类型

JToken jt = JToken(json);

 if (jt.Type == JTokenType.Array) ... your code here

相关问题