Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Json.net将嵌套的Json反序列化为字符串_C#_Json_Json.net - Fatal编程技术网

C#Json.net将嵌套的Json反序列化为字符串

C#Json.net将嵌套的Json反序列化为字符串,c#,json,json.net,C#,Json,Json.net,我有以下json字符串 { "property1" : "value", "property2" : 2, "property3" : { "subprperty1" : "value" } } 我想反序列化它(使用Newtonsoft的Json.net),但保留property3作为字符串 因此,我创建了以下模型类 class JsonModel { string property1 {get; set;} int property2 {get; set;} string pro

我有以下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(json_字符串)反序列化它时我得到以下错误:

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; }
}
注意

有两种方法可以轻松创建模型

  • 您可以在VisualStudio中使用Web Essentials,使用
    Edit>Paste special>Paste JSON
    作为一个类,您可以更容易地了解JSON和模型之间的关系

  • 如果您不能使用WebEssentials,您可以使用在线JSON来为类建模

  • 您可以尝试使用这些模型来携带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);
    
    classjsonmodel
    {
    字符串属性1{get;set;}
    int property2{get;set;}
    T属性3{get;set;}
    }
    类其他魔法类
    {
    字符串子参数1{get;set;}
    }
    ...
    var results=JsonConvert.DeserializeObject(json_字符串);
    
    如果任务是反序列化对象,同时将
    属性3
    保留为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());
    

    @通用谢谢你的解决方案也很有用:)谢谢,但我需要将它作为字符串保存,而不是另一个模型类。如果它不是一个模型类,你就不能将它作为字符串保存。但是您可以添加一个getter,将其序列化为字符串……这是因为每次调用prop3的内容/结构都不同。但是您的
    property3
    是一个JSON对象,而不是字符串。你对prop3的
    内容/结构的意思是什么?每次调用都不同?不过,我需要将prop3保留为字符串,而不是另一个模型“神奇”类,这是因为每次调用prop3的内容/结构都不同。这是非常有趣的方法。谢谢,我会考虑的。
    
    { "subprperty1": "value" }