[英]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:如果我定義一個“對象”類型的屬性,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.