在不创建类的情况下反序列化 JSON 响应

and*_*ewb 4 c# json

从 API 调用的结果来看,我有大量的 JSON 需要处理。

我目前有这个

Object convertObj = JsonConvert.DeserializeObject(responseFromServer);
Run Code Online (Sandbox Code Playgroud)

我知道我可以做类似的事情

Movie m = JsonConvert.DeserializeObject<Movie>(responseFromServer);
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

m.FieldName
m.AnotherField
//etc
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想做类似的事情

var itemName = convertObj["Name"];
Run Code Online (Sandbox Code Playgroud)

获取列表中第一项的第一个 Name 值。

这是可能的,还是我必须创建一个类来反序列化?

我不想创建类的原因是我不是 API 的所有者,并且字段结构可能会改变。

编辑。

好的,所以我创建了这个类,因为它似乎是最好的方法,但是有没有办法将 JSON 反序列化为列表?

var sessionScans = new List<SessionScan>();
sessionScans = JsonConvert.DeserializeObject<SessionScan>(responseFromServer);
Run Code Online (Sandbox Code Playgroud)

抱怨它无法将 SessionScan 转换为通用列表。

Ana*_*ran 12

对于.NET 6,可以按如下方式完成此操作,

using System.Text.Json;
using System.Text.Json.Nodes;

string jsonString = @"some json string here";

JsonNode forecastNode = JsonNode.Parse(jsonString)!;

int temperatureInt = (int)forecastNode!["Temperature"]!;
Console.WriteLine($"Value={temperatureInt}");

//for nested elements, you can access as below
int someVal = someNode!["someParent"]["childId"]!.ToString();

Run Code Online (Sandbox Code Playgroud)

请参阅MS 文档页面以获取更多示例 - 使用创建对象initializers、生成changesDOM、反序列化subsectionJSON 有效负载。


Rob*_*Rob 8

无需使用dynamic,您可以简单地使用JTokenwhich 已经满足您的期望:

var json = @"
    {
        ""someObj"": 5
    }
";
var result = JsonConvert.DeserializeObject<JToken>(json);
var t = result["someObj"]; //contains 5
Run Code Online (Sandbox Code Playgroud)


Yan*_*nga 6

您可以尝试使用JObject.Parse

dynamic convertObj = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = convertObj.Name;
string address = convertObj.Address.City;
Run Code Online (Sandbox Code Playgroud)