天道酬勤,学无止境

需要将以下 json 转换(反序列化)为 C# 对象(Need to convert(Deserialize) following json into C# object)

问题

如何在 C# 对象中转换(反序列化)以下 json 格式? 所有这些 json 文本都一次性转换(反序列化),否则我需要一次又一次地转换子对象

我正在尝试这样的事情

var x = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(json_data);

{  
   "Id":"1405de4d-2823-43b4-8dba-66c2714bc7f",
   "Name":"Sports/Boxing",

   "Parent":{  
      "Id":"88ada251-cff1-4eb7-bc47-2e6d366616a63",
      "Name":"http://localhost:80/PDC/Sports/Boxing",
      "DurationMilliseconds":227.2,
      "StartMilliseconds":0,
      "Children":[  
         {  
            "Id":"dbf36d18-8abd-43f1-ae9b-640cb3d77a87",
            "Name":"xx",
            "DurationMilliseconds":212,
            "Milliseconds":15.1,
           l
}
回答1

使用 http://jsonclassgenerator.codeplex.com/ 和手动调整,我将所需的类减少到 2 个(root 和 childs 类实际上是相同的):

请注意,您可以为类指定任何名称,使与 JSON 链接的原因是每个属性上方的[JsonProperty("...")]属性。

using System;
using Newtonsoft.Json;

namespace WpfApplication3
{
    public partial class MainWindow
    {
        private readonly string json = @"
{  
   ""Id"":""1405de4d-2823-43b4-8dba-66c2714bc7f"",
   ""Name"":""Sports/Boxing"",
   ""Started"":""\/Date(1472064057630)\/"",
   ""DurationMilliseconds"":227.2,
   ""MachineName"":""RED"",
   ""CustomLinks"":null,
   ""Root"":{  
      ""Id"":""88ada251-cff1-4eb7-bc47-2e6d366616a63"",
      ""Name"":""http://localhost:80/PDC/Sports/Boxing"",
      ""DurationMilliseconds"":227.2,
      ""StartMilliseconds"":0,
      ""Children"":[  
         {  
            ""Id"":""dbf36d18-8abd-43f1-ae9b-640cb3d77a87"",
            ""Name"":""Red Eagle"",
            ""DurationMilliseconds"":212,
            ""StartMilliseconds"":15.1,
            ""Children"":[  
               {  
                  ""Id"":""dbd7018d-421d-42bd-b0e5-fd3e9462cca0"",
                  ""Name"":""Blue Eagle"",
                  ""DurationMilliseconds"":106.8,
                  ""StartMilliseconds"":120.4,
                  ""Children"":[  
                     {  
                        ""Id"":""c86199e0-d12b-4bd0-90ea-9f15a2618160"",
                        ""Name"":""True Eagle"",
                        ""DurationMilliseconds"":0.3,
                        ""StartMilliseconds"":226.9,
                        ""Children"":null,
                        ""CustomTimings"":null
                     }
                  ],
                  ""CustomTimings"":null
               }
            ],
            ""CustomTimings"":null
         }
      ],
      ""CustomTimings"":null
   },
   ""ClientTimings"":null,
   ""User"":""::1"",
   ""Storage"":null
}";

        public MainWindow()
        {
            InitializeComponent();
            var o = JsonConvert.DeserializeObject<MyObject>(json);
        }
    }

    public class Child
    {
        [JsonProperty("Id")]
        public string Id { get; set; }

        [JsonProperty("Name")]
        public string Name { get; set; }

        [JsonProperty("DurationMilliseconds")]
        public double DurationMilliseconds { get; set; }

        [JsonProperty("StartMilliseconds")]
        public double StartMilliseconds { get; set; }

        [JsonProperty("Children")]
        public Child[] Children { get; set; }

        [JsonProperty("CustomTimings")]
        public object CustomTimings { get; set; }
    }

    public class MyObject
    {
        [JsonProperty("Id")]
        public string Id { get; set; }

        [JsonProperty("Name")]
        public string Name { get; set; }

        [JsonProperty("Started")]
        public DateTime Started { get; set; }

        [JsonProperty("DurationMilliseconds")]
        public double DurationMilliseconds { get; set; }

        [JsonProperty("MachineName")]
        public string MachineName { get; set; }

        [JsonProperty("CustomLinks")]
        public object CustomLinks { get; set; }

        [JsonProperty("Root")]
        public Child Root { get; set; }

        [JsonProperty("ClientTimings")]
        public object ClientTimings { get; set; }

        [JsonProperty("User")]
        public string User { get; set; }

        [JsonProperty("Storage")]
        public object Storage { get; set; }
    }
}
回答2

有两种方式:

  1. 您可以将(使用 Newtonsoft.Json)反序列化为 JObject:

     var jsonObj = JsonConvert.DeserializeObject(json) as JObject; // Then you may access properties like this: var id = jsonObj ["Id"].Value<int>();

此外,有可能遍历这个“树”对象。 更多详情请访问 http://www.newtonsoft.com/json/help/html/t_newtonsoft_json_linq_jobject.htm

  1. 您可以使用 JSON 生成类(例如 http://json2csharp.com/)并编写如下内容:

     var rootObject = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObjectType>(json);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用JsonFormat将Jackson Json NULL字符串反序列化为日期(How to deserialize Jackson Json NULL String to Date with JsonFormat)
    问题 我已经看了很多,但到目前为止仍然无法得到答案,非常感谢任何帮助! 我有一个简单的String到Date字段映射,并尝试将 JSON 字符串读取到 Java 对象。 @JsonInclude(value=Include.NON_EMPTY) @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd-MMM-yyyy", timezone="PST") protected Date eolAnnounceDate; 但是,如果 JSON 字符串值为空,我会收到以下异常。 有人可以告诉我如何解决这个问题吗? 我尝试了一些选项,但它们都是用于序列化的。 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(Include.NON_NULL); objectMapper.setSerializationInclusion(Include.NON_EMPTY); 例外 : java.lang.IllegalArgumentException:无法解析日期值“NULL”(格式:“dd-MMM-yyyy”):无法解析的日期:“NULL”com.fasterxml.jackson.databind.deser.std
  • JACKSON 支持 Java 泛型吗?(JACKSON support for Java Generics?)
    问题 目前,我正在研究一个基于架构的 restFul 项目。 因此,我们使用 JAXB 进行 XSD-->JAVA 转换。 我有一个类如下: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "systemResponse" }) @XmlRootElement(name = "RestResponse") public class RestResponse implements Serializable { private final static long serialVersionUID = 1L; @XmlElementRef(name = "SystemResponse", namespace = "http://www.intuit.com/psd/cdm/v1", type = JAXBElement.class) protected JAXBElement<? extends CdmComplexBase> systemResponse; ... } 这是它的序列化方式: {"systemResponse":{"name":"{http://www.intuit.com/psd/cdm/v1}Transactions","declaredType":"com.intuit
  • 如何将Json数组转换为C#中的对象列表(How to convert Json array to list of objects in c#)
    问题 我有如下的Json字符串 { "JsonValues":{ "id": "MyID", "values": { "value1":{ "id": "100", "diaplayName": "MyValue1" }, "value2":{ "id": "200", "diaplayName": "MyValue2" } } } } 我想将Json字符串转换为以下类 class ValueSet { [JsonProperty("id")] public string id { get; set; } [JsonProperty("values")] public List<Value> values { get; set; } } class Value { public string id { get; set; } public string DiaplayName { get; set; } } 我的反序列化代码是 JavaScriptSerializer js = new JavaScriptSerializer(); StreamReader sr = new StreamReader(@"ValueSetJsonString.txt"); string jsonString = sr.ReadToEnd(); var items = JsonConvert
  • 无法从 START_OBJECT 令牌反序列化 org.joda.time.DateTime 或 LocalDate 的实例(Can not deserialize instance of org.joda.time.DateTime or LocalDate out of START_OBJECT token)
    问题 v2.1.1,joda 模块。 我可以使用 objectMapper.readValue(file, pojo .class); 在单元测试中将 json 文件转换为 pojo。 但是,当 Spring RESTTemplate 客户端调用默认的 json 转换器来转换包含具有 Joda 类型(DateTime 或 LocalDate)的域对象的 inputStream 时,它会生成错误: objectMapper.readValue(httpInputMessage.getBody(), javaType) com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.joda.time.DateTime out of START_OBJECT token at Source: org.mortbay.jetty.HttpParser$Input@46a09b; line: 1, column: 752 at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) at com.fasterxml.jackson.databind
  • 在 C# 中从 base64 反序列化对象(Object de-serializing from base64 in C#)
    问题 我有一个班级 [Serializable] public class ExternalAccount { public string Name { get;set;} } 我已将其转换为 JSON 像这样 {\"Name\":\"XYZ\"} 然后我对 JSON 字符串进行了 base64 编码 然后我通过网络发送到一个 web api 服务 我收到 base64 编码的字符串,现在需要将它反序列化回原始对象,如上所述(ExternalAccount),所以我首先做一个 byte[] byteArray = Convert.FromBase64String(base64EncodedExternalAccount); 你下一步怎么做? 我已经尝试了以下但返回空... using (MemoryStream memoryStream = new MemoryStream(byteArrayToConvert)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); // set memory stream position to starting point memoryStream.Position = 0; // Deserializes a stream into an object graph and
  • 解决json字符串转为对象时LocalDateTime异常问题
    1 出现异常 这次的异常出现在前端向后端发送请求体里带了两个日期,在后端的实体类中,这两个日期的格式都是JDK8中的时间类LocalDateTime。默认情况下,LocalDateTime只能解析2020-01-01T10:00:00这样标准格式的字符串,这里日期和时间中间有一个T。如果不做任何修改的话,LocalDateTime直接解析2020-05-01 08:00:00这种我们习惯上能接受的日期格式,会抛出异常。 异常信息: org.springframework.http.converter.HttpMessageNotReadableException: Invalid JSON input: Cannot deserialize value of type `java.time.LocalDateTime` from String "2020-05-04 00:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-05-04 00:00' could not be parsed at index 10; nested exception is com.fasterxml.jackson.databind.exc
  • 如何将具有 OData 的 HttpResponseMessage 转换为 C# 对象?(How to convert HttpResponseMessage having OData to a C# object?)
    问题 我正在从连接到 CRM 的 C# 应用程序调用 REST 服务。 这将返回 HttpResponseMessage。 response.Content.ReadAsStringAsync().Result 上述语句返回以下输出。 我需要将其转换为 Account 对象,该对象已经具有“accountnumber 和 accountid 属性。 { "@odata.context":"https://APIURL/api/data/v8.1/$metadata#account(accountnumber)","value":[ { "@odata.etag":"W/\"12496866 \"","accountnumber":"D00208","accountid":"30417c0f-7b8c-e611-80f3-5065f38bd4d1" } ] } 我试过以下代码 Account return = JsonConvert.DeserializeObject<Account>(response.Content.ReadAsStringAsync().Result); 但这不会填充对象,并且它在 accountnumber 和 accountid 字段中始终具有空值。 关于如何将此响应正确转换为 C# 类型的任何想法。 回答1 你应该这样做 - public class
  • Javascript JSON日期反序列化(Javascript JSON Date Deserialization)
    问题 我正在尝试反序列化具有javascript日期的json对象。 在对象上调用JSON.stringify时,日期会序列化为未正确反序列化回日期的字符串。 我尝试使用带有chrome,IE和FF的本机浏览器实现以及使用jquery来反序列化对象。 两者都给出了一些结果。 这是代码段: var obj = {Date: new Date()}; var objSer = JSON.stringify(obj); var objDeser = JSON.parse(objSer); var objJqDeser = $.parseJSON(objSer); function getYear(value){ try{ return value.getYear(); } catch(err){ return err; } } $("#orig").text("Orig Year: " + getYear(obj.Date)); $("#deser").text("Deser Year: " + getYear(objDeser.Date)); $("#jqDeser").text("JqDeser Year: " + getYear(objJqDeser.Date)); 我希望objDeser.Date是一个js日期而不是字符串。 您可以在这里看到此问题的实际运行:http:/
  • Jackson真的无法将json反序列化为通用类型吗?(Is Jackson really unable to deserialize json into a generic type?)
    问题 这是一个重复的问题,因为以下问题很混乱或根本无法回答: 将通用类型与杰克逊反序列化 杰克逊反序列化为运行时指定的类 杰克逊使用通用类反序列化 杰克逊反序列化通用类变量 我希望这个问题最终能找到一个答案,使之永远清楚。 有模特儿: public class AgentResponse<T> { private T result; public AgentResponse(T result) { this.result = result; } public T getResult() { return result; } } JSON输入: {"result":{"first-client-id":3,"test-mail-module":3,"third-client-id":3,"second-client-id":3}} 和两种建议的反序列化泛型类型的方法: mapper.readValue(out, new TypeReference<AgentResponse<Map<String, Integer>>>() {}); 或者 JavaType javaType = mapper.getTypeFactory().constructParametricType(AgentResponse.class, Map.class); mapper.readValue(out
  • 如何使用Jackson的objectMapper反序列化接口字段?(How to deserialize interface fields using Jackson's objectMapper?)
    问题 ObjectMapper的readValue(InputStream in, Class<T> valueType)函数需要Class。 但是,如果我在内部传递的类将某些接口作为数据成员,该如何使用它。 尽管我能理解此异常的原因,因为杰克逊没有获得所传递类的内部接口的具体类,但是我的问题是如何解决它? 那我该如何反序列化呢? 我要反序列化的类是: class BaseMetricImpl<N> implements Metric<N> { protected MetricValueDescriptor descriptor; } 这里MetricValueDescriptor是一个接口,所以这给了我以下错误:- com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of MetricValueDescriptor, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information at [Source: java.io
  • 无法读取JSON:无法从START_OBJECT令牌中反序列化hello.Country []的实例(Could not read JSON: Can not deserialize instance of hello.Country[] out of START_OBJECT token)
    问题 我有可以给我所有国家/地区的休息网址-http://api.geonames.org/countryInfoJSON?username=volodiaL。 我从春季3开始使用RestTemplate将返回的json解析为java对象: RestTemplate restTemplate = new RestTemplate(); Country[] countries = restTemplate.getForObject("http://api.geonames.org/countryInfoJSON?username=volodiaL",Country[].class); 当我运行此代码时,我得到一个异常: Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of hello.Country[] out of START_OBJECT token at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1846149; line: 1, column: 1] at com.fasterxml.jackson.databind
  • 如何使用Jackson将原始JSON包含在对象中?(How can I include raw JSON in an object using Jackson?)
    问题 当使用Jackson对对象进行反序列化时,我试图在Java对象中包含原始JSON。 为了测试此功能,我编写了以下测试: public static class Pojo { public String foo; @JsonRawValue public String bar; } @Test public void test() throws JsonGenerationException, JsonMappingException, IOException { String foo = "one"; String bar = "{\"A\":false}"; Pojo pojo = new Pojo(); pojo.foo = foo; pojo.bar = bar; String json = "{\"foo\":\"" + foo + "\",\"bar\":" + bar + "}"; ObjectMapper objectMapper = new ObjectMapper(); String output = objectMapper.writeValueAsString(pojo); System.out.println(output); assertEquals(json, output); Pojo deserialized = objectMapper
  • 如何将动态对象转换为 JSON 字符串 c#?(How to convert a dynamic object to JSON string c#?)
    问题 我有以下从第三方库获取的动态对象: IOrderStore os = ss.GetService<IOrderStore>(); IOrderInfo search = os.Orders.Where(t => t.Number == "test").FirstOrDefault(); IOrder orderFound = os.OpenOrder(search, true); dynamic order = (dynamic)orderFound; dynamic requirements = order.Title.Commitments[0].Requirements; 我需要将其解析为 JSON 字符串。 我试过这个(使用 JSON.net): string jsonString = JsonConvert.SerializeObject(requirements); return jsonString; 但是我得到了一个看似损坏的 JSON 字符串,如下所示: [{"$id":"1"},{"$id":"2"},{"$id":"3"},{"$id":"4"},{"$id" :"5"},{"$id":"6"},{"$id":"7"},{"$id":"8"},{"$id":"9"}, {"$id":"10"},{"$id":"11"},{"$id":"12"},{"
  • C# 无法将 System.String 强制转换或转换为 Class 对象(C# Could not Cast or Convert System.String to Class object)
    问题 我正在尝试反序列化从 Web API 收到的 JSON 字符串 try { string r = await App.client.GetUser(); App.Authentication = JsonConvert.DeserializeObject<ApiResult>(r); await DisplayAlert("TEST", App.Authentication.ToString(), "OK"); Application.Current.MainPage = new Schedule(); } catch (Exception p) { await DisplayAlert("Getting Authentication failed", p.ToString(), "TEST"); } 但是它给出了错误:Could not Cast or Convert System.String to App1.ApiResult App.Authentication = JsonConvert.DeserializeObject<ApiResult>(r); 应用程序身份验证: public static ApiResult Authentication = new ApiResult();` JSON 字符串: "\"{\\"status\\":\\"0\\",\\
  • 在自定义控制器中解析实体URI(Spring HATEOAS)(Resolving entity URI in custom controller (Spring HATEOAS))
    问题 我有一个基于spring-data-rest的项目,也有一些自定义端点。 为了发送POST数据,我使用的是json之类的 { "action": "REMOVE", "customer": "http://localhost:8080/api/rest/customers/7" } 这对于s​​pring-data-rest来说很好,但是不适用于自定义控制器。 例如: public class Action { public ActionType action; public Customer customer; } @RestController public class ActionController(){ @Autowired private ActionService actionService; @RestController public class ActionController { @Autowired private ActionService actionService; @RequestMapping(value = "/customer/action", method = RequestMethod.POST) public ResponseEntity<ActionResult> doAction(@RequestBody Action
  • 使用 Jackson 反序列化 JSON 对象(Deseralizing JSON Objects Using Jackson)
    问题 我目前正在开发一个 Java Web 应用程序,该应用程序使用 Magento REST API 公开的 JSON 数据。 api返回的数据示例如下: {"1":{"entity_id":"1","name":"Wedding dress","description":"White wedding dress"},"2":{"entity_id":"2","name":"Sunglasses", "description":"Black sunglasses"}} 我的应用程序中有一个 Java 类,如下所示: public class Item { @JsonProperty("entity_id") private String entityId; private String name; private String description; //... } 我想对数据进行反序列化并将其转换为ArrayList<Item>但我不断收到以下错误: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token at [Source: java.io.StringReader
  • 从 JSON 反序列化 java 枚举(Deserialize java enum from JSON)
    问题 我们使用 Jackson 1.9.1 来序列化和反序列化 JSON 请求响应字符串到/从 Java 对象。 原始 Java 类型、集合类型和自定义对象被(反)序列化没有问题。 但是,我在尝试将 JSON 字符串反序列化为 java 枚举时遇到问题。 JSON 字符串序列化如下: "wt":{"wt":100.5,"unit":{"LBS":3}} wt 的 Java 类型如下所示: public class Weight { protected double weight; protected Unit unit; } 我在 SO 上提到了这个、这个和这个,并提出了重量单位的枚举,如下所示: public enum Unit { KG("kg"), GM("gm"), LBS("lbs"), OZ("oz"); private String value; private WeightMeasurementUnit(String value) { this.value = value; } @JsonValue public String getValue() { return this.value; } @JsonCreator public static Unit create(String val) { Unit[] units = Unit.values(); for
  • 无法从 START_ARRAY 令牌反序列化 java.util.HashMap 的实例(Can not deserialize instance of java.util.HashMap out of START_ARRAY token)
    问题 我在使用 jackson-core-2.7.3.jar 解析 JSON 时遇到问题您可以从这里获取它们 http://repo1.maven.org/maven2/com/fasterxml/jackson/core/ 我的 JSON 文件是 [ { "Name": "System Idle Process", "CreationDate": "20160409121836.675345+330" }, { "Name": "System", "CreationDate": "20160409121836.675345+330" }, { "Name": "smss.exe", "CreationDate": "20160409121836.684966+330" } ] 我试图解析的Java代码是 byte[] mapData = Files.readAllBytes(Paths.get("process.txt")); Map<String,String> myMap = new HashMap<String, String>(); ObjectMapper objectMapper=new ObjectMapper(); myMap = objectMapper.readValue(mapData, HashMap.class); System.out.println(
  • 使用C#反序列化JSON(Deserialize JSON with C#)
    问题 我正在尝试将Facebook朋友的Graph API调用反序列化为对象列表。 JSON对象如下所示: {"data":[{"id":"518523721","name":"ftyft"}, {"id":"527032438","name":"ftyftyf"}, {"id":"527572047","name":"ftgft"}, {"id":"531141884","name":"ftftft"}, {"id":"532652067","name"... List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result); 它不起作用,因为原始对象无效。 我该如何反序列化? 回答1 您需要创建一个像这样的结构: public class Friends { public List<FacebookFriend> data {get; set;} } public class FacebookFriend { public string id {get; set;} public string name {get; set;} } 然后,您应该可以执行以下操作: Friends facebookFriends = new JavaScriptSerializer
  • JSON 反序列化 - 字符串自动转换为 Int(JSON Deserialization - String Is Automatically Converted To Int)
    问题 当我将 JSON 反序列化为下面的 C# 对象时,无论是显式使用 Newtonsoft 还是通过 ASP.NET Web Api 的模型绑定机制,字符串id值都会自动转换为 int。 我希望它抛出异常或引发错误,因为存在类型不匹配。 这是 JSON 在规范中应该如何工作? 如果没有,我怎样才能防止这种自动转换? JSON: {"id":"4", "name":"a"} C# 模型: int id; string name int id; string name 回答1 这是 Json.NET 的一个特性:在反序列化原始类型时,它会尽可能将原始 JSON 值转换为目标 c# 类型。 由于字符串"4"可以转换为整数,反序列化成功。 如果您不想要此功能,您可以为整数类型创建一个自定义 JsonConverter,以检查正在读取的令牌是否真的是数字(或null ,对于可空值): public class StrictIntConverter : JsonConverter { readonly JsonSerializer defaultSerializer = new JsonSerializer(); public override bool CanConvert(Type objectType) { return objectType.IsIntegerType(); }