C# 从imglib生成JSON文件

C# 从imglib生成JSON文件,c#,angularjs,json,C#,Angularjs,Json,我正在尝试制作一个可以在angularjs项目中使用的.JSON文件。我希望后端自动更新网站到什么是在img文件夹 我所做的是: 首先,我搜索文件夹中的所有项目: public static String[] GetFilesFrom(String searchFolder, String[] filters, bool isRecursive) { List<String> filesFound = new List<String>();

我正在尝试制作一个可以在angularjs项目中使用的.JSON文件。我希望后端自动更新网站到什么是在img文件夹

我所做的是:

首先,我搜索文件夹中的所有项目:

    public static String[] GetFilesFrom(String searchFolder, String[] filters, bool isRecursive)
    {
        List<String> filesFound = new List<String>();
        var searchOption = isRecursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
        foreach (var filter in filters)
          {
            filesFound.AddRange(Directory.GetFiles(searchFolder, String.Format("*.{0}", filter), searchOption));
          }
        return filesFound.ToArray();
    }
尝试将其写入JSON

       var _data = new Dictionary<string, string> {};

        for (int i = 0; i < files.Length; i++)
        {
            _data = new Dictionary<string, string>
         {
                { "img", files[i] }
         };
        }
        string json = JsonConvert.SerializeObject(_data.ToArray());
        System.IO.File.AppendAllText(@"\js\json.json", json);
数组“文件”不包含多个图片,“文件”中的所有路径都正确。为什么它只显示数组中的最后一项?我知道“for”语句是错误的,如何添加到字典中而不在使用相同键和 如何让它以JSON格式显示所有内容:

[
 {
   "img": "images\\galleri\\placeholder.png"
 },
 {
   "img": "images\\galleri\\img1.png"
 },
 {
   "img": "images\\galleri\\img2.png"
 }
]  

创建要序列化的类映像

public class Image
{
   [JsonProperty("img")]
   public string ImagePath {get; set;}
}
您的for循环将如下所示:

List<Image> images = new List<Image>();
for (int i = 0; i < files.Length; i++)
{
   Image img = new Image() {ImagePath = files[i]};
   images.Add(img);
}

string json = JsonConvert.SerializeObject(images);
列表图像=新列表();
for(int i=0;i
阅读了您的评论后,我明白了问题不仅仅是序列化,第一个问题是每次输入相同的密钥。所以我想出了
列表
,而不是
新字典
。现在看起来像这样

string[] files = { "placeholder.png", "img1.png", "img2.png" }; //Just Entered Dummy Data for test
List<KeyValuePair<string, string>> _data = new List<KeyValuePair<string, string>>();
for(int i = 0; i < files.Length; i++)
{
    _data.Add(new KeyValuePair<string, string>("img", files[i]));
}
JsonSerializerSettings jss = new JsonSerializerSettings();
jss.Converters.Add(new KeyValuePairJsonConverter());
jss.NullValueHandling = NullValueHandling.Ignore;
jss.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(_data, jss);
public class KeyValuePairJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        List<KeyValuePair<string, string>> list = value as List<KeyValuePair<string, string>>;
        writer.WriteStartArray();
        foreach(var item in list)
        {
            writer.WriteStartObject();
            writer.WritePropertyName(item.Key.ToString());
            writer.WriteValue(item.Value.ToString());
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<KeyValuePair<string, string>>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jsonObject = JObject.Load(reader);
        var target = Create(objectType, jsonObject);
        serializer.Populate(jsonObject.CreateReader(), target);
        return target;
    }

    private object Create(Type objectType, JObject jsonObject)
    {
        if(FieldExists("Key", jsonObject))
        {
            return jsonObject["Key"].ToString();
        }

        if(FieldExists("Value", jsonObject))
        {
            return jsonObject["Value"].ToString();
        }
        return null;
    }

    private bool FieldExists(string fieldName, JObject jsonObject)
    {
        return jsonObject[fieldName] != null;
    }
}
输出将是


我认为您在循环中迭代时正在覆盖数据,这就是为什么您只有最后一个条目。您是对的,但我不知道如何不覆盖dic中的数据,因为所有dic都有相同的“img”键。感谢您花时间回答问题,并给出了非常详细的答案:-)
string[] files = { "placeholder.png", "img1.png", "img2.png" }; //Just Entered Dummy Data for test
List<KeyValuePair<string, string>> _data = new List<KeyValuePair<string, string>>();
for(int i = 0; i < files.Length; i++)
{
    _data.Add(new KeyValuePair<string, string>("img", files[i]));
}
JsonSerializerSettings jss = new JsonSerializerSettings();
jss.Converters.Add(new KeyValuePairJsonConverter());
jss.NullValueHandling = NullValueHandling.Ignore;
jss.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(_data, jss);
public class KeyValuePairJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        List<KeyValuePair<string, string>> list = value as List<KeyValuePair<string, string>>;
        writer.WriteStartArray();
        foreach(var item in list)
        {
            writer.WriteStartObject();
            writer.WritePropertyName(item.Key.ToString());
            writer.WriteValue(item.Value.ToString());
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<KeyValuePair<string, string>>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jsonObject = JObject.Load(reader);
        var target = Create(objectType, jsonObject);
        serializer.Populate(jsonObject.CreateReader(), target);
        return target;
    }

    private object Create(Type objectType, JObject jsonObject)
    {
        if(FieldExists("Key", jsonObject))
        {
            return jsonObject["Key"].ToString();
        }

        if(FieldExists("Value", jsonObject))
        {
            return jsonObject["Value"].ToString();
        }
        return null;
    }

    private bool FieldExists(string fieldName, JObject jsonObject)
    {
        return jsonObject[fieldName] != null;
    }
}