C# 从imglib生成JSON文件
我正在尝试制作一个可以在angularjs项目中使用的.JSON文件。我希望后端自动更新网站到什么是在img文件夹 我所做的是: 首先,我搜索文件夹中的所有项目: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>();
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;
}
}