【问题标题】:Nested Array in Json- c# and .netJson-c# 和 .net 中的嵌套数组
【发布时间】:2021-01-22 19:42:03
【问题描述】:

我正在尝试像这样使用 c# 来创建一个 json 文件

{
  "name" :{
       "firstname": "john",
       "lastname": "Doe" 
   },
   "age":{
       "real": "2",
       "dogyears": "22"
   },
   "boo":{
        "foo":[
           "bar",
           "haa",
           "haha"
         ]
   }
}

我的班级看起来像这样-我不知道这是否正确-

    public class data
    {
        public string[] name { get; set; }
        public string[] age { get; set; }
        public string[] boo {get; set;}
    }

还有什么我需要添加到课程中的吗?

另外,这是我尝试将其写入外部 json 文件的方式

String first_name= firstN.Text;
String last_name=lastN.Text;
....
List<data> dataa = new List<data>();
        dataa.Add(new data()
        {
            //I am not sure what goes here - probably something like this
            firstname = first_name;

        });
        string json = JsonConvert.SerializeObject(dataa.ToArray());

        //write string to file
        System.IO.File.WriteAllText(JsonFilePath, json);

我是新人-所以任何帮助将不胜感激谢谢:)

【问题讨论】:

  • 所有根属性都是对象,而不是数组。只有boo.foostring[] 数组
  • 您可以让 Visual Studio 通过复制 JSON 字符串并使用 Paste Special &gt; Paste JSON as Classes 将其粘贴到源文件中来生成必要的类
  • 对不起,我没明白你的意思。你能详细说明一下吗?
  • 谢谢。这是很好的信息

标签: c# asp.net arrays json .net


【解决方案1】:

Panagiotis 评论了非常有用的“将 json 粘贴为类”功能,但我通常更喜欢使用 http://QuickType.io 之类的东西,因为它会生成更多功能完整/有用/符合名称的类集:

// <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
//    using Leia;
//
//    var data = Data.FromJson(jsonString);

namespace Leia
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class Data
    {
        [JsonProperty("name")]
        public Name Name { get; set; }

        [JsonProperty("age")]
        public Age Age { get; set; }

        [JsonProperty("boo")]
        public Boo Boo { get; set; }
    }

    public partial class Age
    {
        [JsonProperty("real")]
        [JsonConverter(typeof(ParseStringConverter))]
        public long Real { get; set; }

        [JsonProperty("dogyears")]
        [JsonConverter(typeof(ParseStringConverter))]
        public long Dogyears { get; set; }
    }

    public partial class Boo
    {
        [JsonProperty("foo")]
        public string[] Foo { get; set; }
    }

    public partial class Name
    {
        [JsonProperty("firstname")]
        public string Firstname { get; set; }

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

    public partial class Data
    {
        public static Data FromJson(string json) => JsonConvert.DeserializeObject<Data>(json, Agarwal.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this Data self) => JsonConvert.SerializeObject(self, Agarwal.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }

    internal class ParseStringConverter : JsonConverter
    {
        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);

        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null) return null;
            var value = serializer.Deserialize<string>(reader);
            long l;
            if (Int64.TryParse(value, out l))
            {
                return l;
            }
            throw new Exception("Cannot unmarshal type long");
        }

        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            if (untypedValue == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
            var value = (long)untypedValue;
            serializer.Serialize(writer, value.ToString());
            return;
        }

        public static readonly ParseStringConverter Singleton = new ParseStringConverter();
    }
}

转到http://quicktype.io 并粘贴您的 json,设置您的选项。结束

我与该服务无关。使用“json to c#”之类的网络搜索可以找到很多其他的


如何使用它:

C# 看起来很像 JSON:

String first_name= firstN.Text;
String last_name=lastN.Text;

Data d = new Data(){
   Name = new Name(){ FirstName = first_name, LastName = last_name }
};

string json = d.ToJson();
System.IO.File.WriteAllText(JsonFilePath, json);

【讨论】:

  • NVM,这太棒了!我喜欢这个工具。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
相关资源
最近更新 更多