如何用C#/Java筛选JSON中displayValue为Outfit的数据并生成图片
实现方案
C# 版本
1. JSON解析与筛选
针对5万行的大JSON文件,推荐使用.NET Core/5+自带的System.Text.Json,它的流式处理能力更适合大文件,能避免内存溢出问题。
- 先定义匹配JSON结构的数据模型:
public class OutfitItem { public TypeInfo Type { get; set; } public string Name { get; set; } public ImageInfo Images { get; set; } public string Rarity { get; set; } } public class TypeInfo { public string DisplayValue { get; set; } } public class ImageInfo { public string SmallIcon { get; set; } public string Icon { get; set; } public string Featured { get; set; } } public class RootObject { public List<OutfitItem> Data { get; set; } }
- 读取并筛选目标数据:
using (var stream = File.OpenRead("your-data.json")) { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var root = await JsonSerializer.DeserializeAsync<RootObject>(stream, options); var filteredOutfits = root.Data.Where(item => item.Type?.DisplayValue == "Outfit").ToList(); }
2. 生成带文本的图片
推荐跨平台的SkiaSharp库来处理图片,比System.Drawing.Common兼容性更好。
- 先安装NuGet包:
SkiaSharp、SkiaSharp.NativeAssets.Linux(非Windows平台需额外安装) - 图片生成代码:
using SkiaSharp; foreach (var outfit in filteredOutfits) { // 加载featured图作为背景 using var bitmap = SKBitmap.Decode(outfit.Images.Featured); using var canvas = new SKCanvas(bitmap); // 配置文本样式 var textPaint = new SKPaint { Color = SKColors.White, TextSize = 48, IsAntialias = true, StrokeWidth = 2, Typeface = SKTypeface.FromFamilyName("Arial", SKFontStyle.Bold) }; // 绘制名称(左上角) canvas.DrawText(outfit.Name, 20, 60, textPaint); // 绘制稀有度(右下角) var rarityWidth = textPaint.MeasureText(outfit.Rarity); canvas.DrawText(outfit.Rarity, bitmap.Width - rarityWidth - 20, bitmap.Height - 40, textPaint); // 保存图片 using var image = SKImage.FromBitmap(bitmap); using var data = image.Encode(SKEncodedImageFormat.Png, 100); using var stream = File.OpenWrite($"{outfit.Name}.png"); data.SaveTo(stream); }
Java 版本
1. JSON解析与筛选
使用Jackson的流式API处理大JSON,避免一次性加载整个文件到内存。
- 定义数据模型:
public class OutfitItem { private TypeInfo type; private String name; private ImageInfo images; private String rarity; // Getters and Setters } public class TypeInfo { private String displayValue; // Getter and Setter } public class ImageInfo { private String smallIcon; private String icon; private String featured; // Getters and Setters }
- 读取并筛选数据:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import java.io.File; import java.util.ArrayList; import java.util.List; ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(new File("your-data.json")); JsonNode dataNode = rootNode.get("data"); List<OutfitItem> filteredOutfits = new ArrayList<>(); for (JsonNode itemNode : dataNode) { String typeDisplay = itemNode.get("type").get("displayValue").asText(); if ("Outfit".equals(typeDisplay)) { OutfitItem outfit = mapper.treeToValue(itemNode, OutfitItem.class); filteredOutfits.add(outfit); } }
2. 生成带文本的图片
使用Java原生的Java2D API处理图片,无需额外依赖。
import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; for (OutfitItem outfit : filteredOutfits) { // 加载背景图 BufferedImage background = ImageIO.read(new File(outfit.getImages().getFeatured())); Graphics2D g2d = background.createGraphics(); // 配置文本样式 g2d.setColor(Color.WHITE); g2d.setFont(new Font("Arial", Font.BOLD, 48)); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); // 绘制名称 g2d.drawString(outfit.getName(), 20, 60); // 绘制稀有度(右下角) FontMetrics metrics = g2d.getFontMetrics(); int x = background.getWidth() - metrics.stringWidth(outfit.getRarity()) - 20; int y = background.getHeight() - 40; g2d.drawString(outfit.getRarity(), x, y); g2d.dispose(); // 保存图片 ImageIO.write(background, "PNG", new File(outfit.getName() + ".png")); }
内容的提问来源于stack exchange,提问作者hello.w.o.r.l.d
相关产品推荐
相关产品推荐

