簡體   English   中英

C#Json.net將嵌套的json反序列化為字符串

[英]C# Json.net deserialize nested json as string

我有以下json字符串

{
 "property1" : "value",
 "property2" : 2,
 "property3" : { "subprperty1" : "value" }
}

我想反序列化它(使用Newtonsoft的Json.net),但將property3保留為字符串。

所以我創建了以下模型類

class JsonModel {
 string property1 {get; set;}
 int property2 {get; set;}
 string property3 {get; set;}
}

但是當我使用JsonConvert.DeserializeObject<JsonModel>(json_string);反序列化它時JsonConvert.DeserializeObject<JsonModel>(json_string); 我收到以下錯誤:

Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: {. 

因為property3是一個對象而不是一個字符串。

您可以嘗試使用類來執行它。

public class Property3
{
    public string subprperty1 { get; set; }
}

public class JsonModel 
{
    public string property1 { get; set; }
    public int property2 { get; set; }
    public Property3 property3 { get; set; }
}

注意

有兩種方法可以輕松創建模型。

  1. 您可以在Visual Studio中使用Web Essentials,使用Edit > Paste special > paste JSON作為類,您可以更輕松地了解Json和模型之間的關系。

  2. 如果您無法使用Web Essentials,則可以使用http://json2csharp.com/在線JSON到Model類。

您可以嘗試使用這些模型來攜帶JSON格式。

"property3" : { "subprperty1" : "value" }

這不是嵌套的json ,它只是一個標准的json對象

更新

從你的評論,我認為你想要一個通用的財產。 如果您的用例事先知道回來的內容,並且有一些子集正在發生變化,那么泛型可能就是您應該在哪里

所以你可以用標准的方式反序列化它

class JsonModel<T> 
{
   string property1 {get; set;}
   int property2 {get; set;}
   T property3 {get; set;}
}

class SomeOtherMagicalClass 
{
   string subprperty1 {get; set;}
}

...

var results = JsonConvert.DeserializeObject<JsonModel<SomeOtherMagicalClass>>(json_string);

好吧,如果任務是反序列化對象,同時保留property3為json字符串,我們可以做兩件事。

第一:使用JObject.Parse解析對象:

class JsonModel {
    public string property1 { get; set; }
    public int property2 { get; set; }
    public string property3 { get; set; }
}

var json_string = "{ \"property1\" : \"value\", \"property2\" : 2, \"property3\" : { \"subprperty1\" : \"value\" } }";
var jObj = JObject.Parse(json_string);
var obj = new JsonModel()
{
    property1 = jObj["property1"].ToString(),
    property2 = (int) jObj["property2"],
    property3 = jObj["property3"].ToString(),
};
Console.WriteLine(obj.property3);

第二步:將obj反序列化為對象字典:

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json_string);
Console.WriteLine(dict["property3"].ToString());

兩者輸出相同:

{ "subprperty1": "value" }

暫無
暫無

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

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