使用DataContractJsonSerializerSettings使用头类在JSON中解析字典

时间:2015-03-22 17:02:57

标签: c# json datacontractjsonserializer

我正在将JSON字符串解析为项目列表。 json文本将项目组织为父项"材料"下的字典。以下代码有效。在我不需要MaterialHeader类的地方有更好的方法吗?

public class Material
{
    public Material()
    {
        E = 209000;
        nu = 0.3;
    }
    public double E;
    public double nu;
    public double ultimateStrength; // new
    public double enduranceLimit; // new
    public double yieldStrength;  // new
    public double density; // new
    public double sB0; //  new
    public String itemNumber; // new

    public string form; // not needed for FEA
    public string description; // not needed for FEA
    public double cost; // not needed for FEA
}

public class MaterialHeader
{
    public Dictionary<String,Material> material;
}

    public List<Material> Materials(String companyID) {

        var response = "{ \"material\": { \"PM00000050\": { \"cost\": \"1.6\",\"E\": \"209000\",\"yieldStrength\": \"306\",\"description\": \"1045\",\"form\": \"Plate\",\"nu\": \"0.3\",\"enduranceLimit\": \"256\",\"sB0\": \"409\",\"ultimateStrength\": \"570\",\"density\": \"7.85\"},\"PM00000051\": { \"cost\": \"1.62\",\"E\": \"209000\",\"yieldStrength\": \"270\",\"description\": \"4140\",\"form\": \"Plate\",\"nu\": \"0.3\",\"enduranceLimit\": \"243\",\"sB0\": \"409\",\"ultimateStrength\": \"540\",\"density\": \"7.85\"},\"PM00000055\": { \"cost\": \"1.61\",\"E\": \"209000\",\"yieldStrength\": \"306\",\"description\": \"K1045\",\"form\": \"Bar\",\"nu\": \"0.3\",\"enduranceLimit\": \"256\",\"sB0\": \"409\",\"ultimateStrength\": \"570\",\"density\": \"7.85\"},\"PM00000056\": { \"cost\": \"1.62\",\"E\": \"209000\",\"yieldStrength\": \"270\",\"description\": \"K4140\",\"form\": \"Bar\",\"nu\": \"0.3\",\"enduranceLimit\": \"243\",\"sB0\": \"409\",\"ultimateStrength\": \"540\",\"density\": \"7.85\"} }}";

    DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings();
        settings.UseSimpleDictionaryFormat = true;

        var serializer2 = new DataContractJsonSerializer(typeof(MaterialHeader), settings);
        var ms2 = new MemoryStream(Encoding.Unicode.GetBytes(response));

        var output1 = new MaterialHeader();
        try
        {
            output1 = (MaterialHeader)serializer2.ReadObject(ms2);
        }
        catch (SerializationException exp)
        {
            System.Windows.Forms.MessageBox.Show(exp.Message);
        }

        var output2 = new List<Material>();
        foreach ( var item in output1.material)
        {
            item.Value.itemNumber = item.Key; // Set the item number
            output2.Add(item.Value);
        }

        return output2;
    }

0 个答案:

没有答案