C# 更改json中的对象元素

C# 更改json中的对象元素,c#,.net,json,json.net,C#,.net,Json,Json.net,我有一个像这样的JSON { "amounts": [ { "tid": 7072, "amount": 10000, "currency": "USD" }, { "tid": 7072, "amount": 4000, "currency": "USD" } ],

我有一个像这样的JSON

{
    "amounts": [
        {
            "tid": 7072,
            "amount": 10000,
            "currency": "USD"
        },
        {
            "tid": 7072,
            "amount": 4000,
            "currency": "USD"
        }
    ],
    "status": 0,
    "errorCode": 0
}
我需要从这个JSON中检索amount值,并将其除以10。之后,我想替换原始json中的amount值。我该怎么做?我正在使用.Net json工具,如NEwtonsoft json。

使用以下工具生成类:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp11
{
    class Program
    {
        static void Main(string[] args)
        {
            var js = "{\"amounts\": [ { \"tid\": 7072, \"amount\": 10000, \"currency\": \"USD\"        },        {            \"tid\": 7072,            \"amount\": 4000,            \"currency\": \"USD\"        }    ],    \"status\": 0,    \"errorCode\": 0}";
            var obj = Welcome.FromJson(js);
            for (int i = 0; i < obj.Amounts.Length; i++)
            {
                obj.Amounts[i].AmountAmount /= 10;
            }
            var newjs = Serialize.ToJson(obj);
            Console.WriteLine(newjs);
            Console.ReadKey();

        }
    }

    public partial class Welcome
    {
        [JsonProperty("amounts")]
        public Amount[] Amounts { get; set; }

        [JsonProperty("status")]
        public long Status { get; set; }

        [JsonProperty("errorCode")]
        public long ErrorCode { get; set; }
    }

    public partial class Amount
    {
        [JsonProperty("tid")]
        public long Tid { get; set; }

        [JsonProperty("amount")]
        public long AmountAmount { get; set; }

        [JsonProperty("currency")]
        public string Currency { get; set; }
    }

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



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

    public static class Serialize
    {
        public static string ToJson(this Welcome self)
        {
            return JsonConvert.SerializeObject(self, Converter.Settings);
        }
    }

}
使用Newtonsoft.Json;
使用Newtonsoft.Json.Converters;
使用制度;
使用System.Collections.Generic;
利用制度全球化;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间控制台AP11
{
班级计划
{
静态void Main(字符串[]参数)
{
var js=“{\\\\\”:[{\\\\\”:7072,\\\\\\\:10000,\\'currency\\:\'USD\'},{\'tid\':7072,\'amount\':4000,\'currency\':\'USD\'}],\'status\':0,\'errorCode\':0};
var obj=Welcome.FromJson(js);
for(int i=0;iJsonConvert.DeserializeObject(json,Converter.Settings);
}
公共静态类转换器
{
公共静态只读JsonSerializerSettings设置=新JsonSerializerSettings
{
MetadataPropertyHandling=MetadataPropertyHandling.Ignore,
DateParseHandling=DateParseHandling.None,
转换器={
新的IsoDateTimeConverter{DateTimeStyles=DateTimeStyles.AssumeUniversal}
},
};
}
公共静态类序列化
{
公共静态字符串ToJson(此欢迎自我)
{
返回JsonConvert.SerializeObject(self,Converter.Settings);
}
}
}
私有字符串分割金额(字符串str,int分母)
{
var obj=(JObject)JsonConvert.DeserializeObject(str);
foreach(obj中的var金额[“金额”])
{
风险价值=金额。价值(“金额”);
var newValue=值/分母;
金额[“金额”]=新值;
}
返回obj.ToString();
}
使用Newtonsoft.Json。 添加对参数“分母”的检查以避免被零除错误。

从like生成quicktype

输出:


我认为您的json是错误的::它应该是这样的:
{“amounts”:[{“tid”:7072,“amount”:10000,“currency”:“USD”},{“tid”:7072,“amount”:4000,“currency”:“USD”}],“status”:0,“errorCode”:0}
您想检索第一个还是第二个对象的金额?取回后,你必须把它除以10,对吗?是的。我想两者都检索。反序列化它,处理对象并再次序列化。只需在
数据['amounts']
中为
循环运行
,对于循环的每次迭代,您可以
循环变量['amount']=循环变量['amount']/10
private string DivideAmounts(string str, int denominator)
    {
        var obj = (JObject)JsonConvert.DeserializeObject(str);
        foreach (var amount in obj["amounts"])
        {
            var value = amount.Value<int>("amount");
            var newValue = value / denominator;
            amount["amount"] = newValue;
        }
        return obj.ToString();
    }
public class Amount
{
    public int tid { get; set; }
    public int amount { get; set; }
    public string currency { get; set; }
}

public class RootObject
{
    public List<Amount> amounts { get; set; }
    public int status { get; set; }
    public int errorCode { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        string inputJson = @"{'amounts':[{'tid':7072,'amount':10000,'currency':'USD'},{'tid':7072,'amount':4000,'currency':'USD'}],'status':0,'errorCode':0}";

        RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(inputJson);

        foreach (var item in rootObject.amounts)
        {
            item.amount = item.amount / 10;
        }

        //OR you can do it with shorter version of foreach
        //rootObject.amounts.ForEach(x => x.amount = x.amount / 10);

        string outputJson = JsonConvert.SerializeObject(rootObject);

        Console.WriteLine(outputJson);
        Console.ReadLine();
    }
}