C# 使用 Newtonsoft 部分解析/反序列化 JSON
本文关键字:反序列化 JSON 分解 使用 Newtonsoft | 更新日期: 2023-09-27 18:35:10
我必须使用.net或newtonsoft json提取json字符串的一部分。
杰森:
var json = "{'"method'":'"subtract'",'"parameters'":{'"minuend'":'"SOME_CUSTOM_JSON_OBJECT_DIFFERENT_FOR_EACH_METHOD'",'"subtrahend'":23}}";
C# 类:
class MyJson{
public string method { get; set; }
//public string parameters {get; set;}
public object parameters {get; set;}
}
- 我不需要解析"参数"json-object的所有子项。"参数"可能是一个非常大的对象([{obj1}...{obj1000}], objX of 1000 个字段),解析,这将不具有性能。我希望即在某些点上完全按照原样传递它,因此转换"string-C#object-string"将是多余的。
- 我不想使用正则表达式或字符串转换(字符串。子字符串,Split和co),由于误差幅度,我知道所有.net和Newtonsoft字符串转换都基于。
问题1:如果我定义一个类型为"object"的属性,newtonsoft将如何处理这个问题?(文档比 msdn 差,所以我正在寻找你的输入,他们已经尝试过了)。
static void Main(string[] args)
{
var json = "{'"method'":'"subtract'",'"parameters'":{'"minuend'":42,'"subtrahend'":23}}";
var data = JsonConvert.DeserializeObject<MyJson>(j);
// what internal representaion of data.parameters?
// How is it actually converted from json-string to an C# object (JObject/JsonObject).
}
在完美情况下:"参数"是一个字符串,调用
ExtractMyJson(jsonString)
给了我 JSON 参数字符串。
基本上我需要牛顿软件版本
string ExtractMyJson(jsonString){
var p1 = jsonString.Split(",");
// .. varios string transformations
return pParams;
}
注意:请不要引用"dynamic"关键字或询问为什么没有字符串转换,这是一个非常具体的问题。
如果你知道你的参数是唯一的,你可以做这样的事情:
class MyJson
{
public string method { get; set; }
public Dictionary<string,object> parameters { get; set; }
}
................
string json = "{'"method'":'"subtract'",'"parameters'":{'"minuend'":{'"img'": 3, '"real'": 4},'"subtrahend'":23}}";
var data = JsonConvert.DeserializeObject<MyJson>(json);
如果你让它作为对象,将接收类型Newtonsoft.Json.Linq.JObject。
你试过JTOKEN
吗?
这是一个相当简单的解决方案,可以部分读取本文中所述的基本或嵌套 JSON。
对于嵌套JSON
{
"key1": {
"key11": "value11",
"key12": "value12"
}
"key2": "value2"
}
它看起来像这样
JToken token = JToken.Parse(json);
var value12 = token.SelectToken("key1.key12");
获取键"key12
的元素。
我认为这可以很好地解决您的问题。
井对象的处理方式与父对象的处理方式相同。它将从图形的底部开始。因此,如果您有类似以下内容:
Person
{
Address Address {get;set;}
}
Json 将开始反序列化地址,然后添加 Person 对象。如果要限制图形深度的大小,可以使用如下设置:
JsonConvert.DeserializeObject<List<IList<IList<string>>>>(json, new JsonSerializerSettings
{
MaxDepth = 2
});
有关 JsonSerializer 的更多配置,请查看 JsonSerializerSettings
如果您的字段是一个对象,则该对象将具有它持有的每个属性的 KeyValuePair,基于此,当您强制转换该字段时,您可以访问该类型。(该行为与在 C# 中为对象赋值类型相同)。
更新:因此,如果您质疑使用JsonObject或类型,那么JObject是用通用格式构造json格式的中间方法。但是使用类型反序列化意味着可以忽略您不感兴趣的属性。映射到具有类型的 json 更有意义,因为它会创建一个新对象并关闭旧的 JObject。