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;}
}
  1. 我不需要解析"参数"json-object的所有子项。"参数"可能是一个非常大的对象([{obj1}...{obj1000}], objX of 1000 个字段),解析,这将不具有性能。我希望即在某些点上完全按照原样传递它,因此转换"string-C#object-string"将是多余的。
  2. 我不想使用正则表达式或字符串转换(字符串。子字符串,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"关键字或询问为什么没有字符串转换,这是一个非常具体的问题。

C# 使用 Newtonsoft 部分解析/反序列化 JSON

如果你知道你的参数是唯一的,你可以做这样的事情:

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。