簡體   English   中英

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

[英]C# Parse/Deserialize JSON partially with Newtonsoft

我必須使用 .net 或 newtonsoft json 提取一部分 json-string。

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}],1000 個字段的 objX),解析這將是性能不佳的。 我希望 ie 完全按原樣傳遞它,因此轉換“string-C#object-string”將是多余的。
  2. 我不想使用正則表達式或字符串轉換(string.Substring、Split 和 co),因為誤差幅度,我知道所有基於 .net 和 newtonsoft 的字符串轉換。

問題 1:如果我定義一個“對象”類型的屬性,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字符串。

基本上我需要 newtonsoft 版本

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 類型。

對象的處理方式與父對象的處理方式相同。 它將從圖表的底部開始。 所以如果你有類似的東西:

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。

你試過JTOKEN嗎?

這是一個相當簡單的解決方案如在本描述部分讀取基本或嵌套JSONs

對於嵌套的JSON

{ 
"key1": {
            "key11": "value11",
            "key12": "value12"
         }
"key2": "value2"
}

它看起來像這樣

JToken token = JToken.Parse(json);
var value12 = token.SelectToken("key1.key12");

獲取鍵"key12

我認為這可以很好地解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM