Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改并重新写入json文件中的密钥_Java_Json_Jackson - Fatal编程技术网

Java 修改并重新写入json文件中的密钥

Java 修改并重新写入json文件中的密钥,java,json,jackson,Java,Json,Jackson,我目前在java中使用JSON文件时遇到一些问题。 这里的目标是将JSON文件中的每个“timestamp_ms”修改为UTC时间和日期 我的代码输入JSON文件,读取并以JSON格式输出它,就像我在最后想要的那样。 然后我遍历所有的时间戳并转换它们 现在我想用我得到的输出替换所有的时间戳,并再次将文件重写为JSON格式(现在转换为时间戳)。 我一直在寻找答案,但到目前为止还没有成功。有谁知道实现这一目标的好方法吗 代码如下: public class JsonMain { public

我目前在java中使用JSON文件时遇到一些问题。 这里的目标是将JSON文件中的每个“timestamp_ms”修改为UTC时间和日期

我的代码输入JSON文件,读取并以JSON格式输出它,就像我在最后想要的那样。 然后我遍历所有的时间戳并转换它们

现在我想用我得到的输出替换所有的时间戳,并再次将文件重写为JSON格式(现在转换为时间戳)。 我一直在寻找答案,但到目前为止还没有成功。有谁知道实现这一目标的好方法吗

代码如下:

public class JsonMain {
    public static void main(String[] args) throws IOException {
        String first = "chatMessage.json";
        String jsonSource = new String((Files.readAllBytes(Paths.get(first))),"UTF-8");
        //print the json file
        System.out.println(jsonSource);

        JSONObject obj = new JSONObject(jsonSource);
        JSONArray arr = new JSONArray(obj.getJSONArray("messages"));

        //iterate trough all the timestamp_ms and get the value
        for(int i=0; i< arr.length(); i++)
        {
            long time = (long)arr.getJSONObject(i).get("timestamp_ms");
            SimpleDateFormat sdf = new SimpleDateFormat();
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            System.out.println(sdf.format(new Date(time)));
            //arr.put("timestamp_ms",sdf.format(new Date(time)));
        }

    }
}
你很接近

只需要引用JSON消息对象而不是数组,然后重写文件

你可以做:

String first = "chatMessage.json";
String jsonSource = new String((Files.readAllBytes(Paths.get(first))),"UTF-8");
//print the json file
System.out.println(jsonSource);

JSONObject obj = new JSONObject(jsonSource);
JSONArray arr = new JSONArray(obj.getJSONArray("messages"));

//iterate trough all the timestamp_ms and get the value
for(int i=0; i< arr.length(); i++) {
    JSONObject currMessage = arr.getJSONObject(i);
    long time = (long) currMessage.get("timestamp_ms");
    SimpleDateFormat sdf = new SimpleDateFormat();
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(sdf.format(new Date(time)));
    currMessage.put("timestamp_ms", sdf.format(new Date(time)));
}

Files.write(Paths.get(first), obj.toString(2).getBytes());

String output = new String((Files.readAllBytes(Paths.get(first))),"UTF-8");
System.out.println(output);
你很接近

只需要引用JSON消息对象而不是数组,然后重写文件

你可以做:

String first = "chatMessage.json";
String jsonSource = new String((Files.readAllBytes(Paths.get(first))),"UTF-8");
//print the json file
System.out.println(jsonSource);

JSONObject obj = new JSONObject(jsonSource);
JSONArray arr = new JSONArray(obj.getJSONArray("messages"));

//iterate trough all the timestamp_ms and get the value
for(int i=0; i< arr.length(); i++) {
    JSONObject currMessage = arr.getJSONObject(i);
    long time = (long) currMessage.get("timestamp_ms");
    SimpleDateFormat sdf = new SimpleDateFormat();
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(sdf.format(new Date(time)));
    currMessage.put("timestamp_ms", sdf.format(new Date(time)));
}

Files.write(Paths.get(first), obj.toString(2).getBytes());

String output = new String((Files.readAllBytes(Paths.get(first))),"UTF-8");
System.out.println(output);

我建议使用基于令牌/事件/流的解决方案。下面是使用tiny parser/generator lib(Gson和Jackson都提供面向流的API)的示例:

import org.green.jelly.appendeablewriter;
导入org.green.jelly.CharArrayCharSequence;
导入org.green.jelly.JsonEventPump;
导入org.green.jelly.JsonNumber;
导入org.green.jelly.JsonParser;
导入java.io.FileReader;
导入java.io.FileWriter;
导入java.io.Writer;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.TimeZone;
公共类转换MyJSON{
公共静态void main(字符串[]args)引发异常{
try(filereaderinput=newfilereader(“/home/user/input.json”);
FileWriter输出=新的FileWriter(“/home/user/output.json”)){
final JsonParser=new JsonParser();
setListener(新的MyTransformer(输出));
最终CharArrayCharSequence charSequence=新的CharArrayCharSequence(4096);
final char[]buffer=charSequence.getChars();
内伦;
而((len=input.read(buffer,0,buffer.length))>-1){
字符序列。设置长度(len);
parser.parse(charSequence);
}
parser.eoj();
}
}
静态类MyTransformer扩展了JsonEventPump{
私有最终SimpleDataFormat sdf=新SimpleDataFormat();
私有布尔值;
MyTransformer(最终写入器输出){
super(新的AppendableWriter(输出));
sdf.setTimeZone(TimeZone.getTimeZone(“UTC”));
}
@凌驾
公共布尔OnObject成员(最终字符序列名称){
isTimestamp=“timestamp_ms”。contentEquals(名称);
返回super.onObjectMember(名称);
}
@凌驾
公共布尔onNumberValue(最终JsonNumber){
if(isTimestamp){
返回super.onStringValue(sdf.format(新日期(number.尾数()));
}
返回super.onNumberValue(number);
}
}
}
此类解决方案的道具:

  • 文件/数据不需要完全加载到内存中,您可以毫无问题地处理MEG/GIG
  • 它的工作速度比任何对象映射代码都快,尤其是对于大型文件
  • 您自然拥有与结果相同的JSON结构
  • 实现任何自定义类型/规则的转换都很容易

我建议使用基于令牌/事件/流的解决方案。下面是使用tiny parser/generator lib(Gson和Jackson都提供面向流的API)的示例:

import org.green.jelly.appendeablewriter;
导入org.green.jelly.CharArrayCharSequence;
导入org.green.jelly.JsonEventPump;
导入org.green.jelly.JsonNumber;
导入org.green.jelly.JsonParser;
导入java.io.FileReader;
导入java.io.FileWriter;
导入java.io.Writer;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.TimeZone;
公共类转换MyJSON{
公共静态void main(字符串[]args)引发异常{
try(filereaderinput=newfilereader(“/home/user/input.json”);
FileWriter输出=新的FileWriter(“/home/user/output.json”)){
final JsonParser=new JsonParser();
setListener(新的MyTransformer(输出));
最终CharArrayCharSequence charSequence=新的CharArrayCharSequence(4096);
final char[]buffer=charSequence.getChars();
内伦;
而((len=input.read(buffer,0,buffer.length))>-1){
字符序列。设置长度(len);
parser.parse(charSequence);
}
parser.eoj();
}
}
静态类MyTransformer扩展了JsonEventPump{
私有最终SimpleDataFormat sdf=新SimpleDataFormat();
私有布尔值;
MyTransformer(最终写入器输出){
super(新的AppendableWriter(输出));
sdf.setTimeZone(TimeZone.getTimeZone(“UTC”));
}
@凌驾
公共布尔OnObject成员(最终字符序列名称){
isTimestamp=“timestamp_ms”。contentEquals(名称);
返回super.onObjectMember(名称);
}
@凌驾
公共布尔onNumberValue(最终JsonNumber){
if(isTimestamp){
返回super.onStringValue(sdf.format(新日期(number.尾数()));
}
返回super.onNumberValue(number);
}
}
}
此类解决方案的道具:

  • 文件/数据不需要完全加载到内存中,您可以毫无问题地处理MEG/GIG
  • 它的工作速度比任何对象映射代码都快,尤其是对于大型文件
  • 您自然拥有与结果相同的JSON结构
  • 实现任何自定义类型/规则的转换都很容易

这似乎也是一个很好的解决方案。。我和maven在这方面合作。。但我会检查一下
{
    "is_still_participant": true,
    "thread_type": "RegularGroup",
    "messages": [{
        "is_unsent": false,
        "sender_name": "User1",
        "timestamp_ms": "10.5.2021, 16:17",
        "type": "Generic",
        "content": "Hello ç á à â ã "
    }, {
        "is_unsent": false,
        "sender_name": "User2",
        "timestamp_ms": "10.5.2021, 16:16",
        "type": "Generic",
        "content": "Hi, how are you?"
    }, {
        "is_unsent": false,
        "sender_name": "User1",
        "timestamp_ms": "10.5.2021, 16:09",
        "type": "Generic",
        "content": "Ã\u0089 to utf?"
    }],
    "title": "chatTitle",
    "thread_path": "inbox/chatTitle_4hyfdfnnhw",
    "participants": [{
        "name": "User1"
    }, {
        "name": "User2"
    }]
}
import org.green.jelly.AppendableWriter;
import org.green.jelly.CharArrayCharSequence;
import org.green.jelly.JsonEventPump;
import org.green.jelly.JsonNumber;
import org.green.jelly.JsonParser;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class TransformMyJson {
    public static void main(String[] args) throws Exception {
        try (FileReader input = new FileReader("/home/user/input.json");
                FileWriter output = new FileWriter("/home/user/output.json")) {

            final JsonParser parser = new JsonParser();
            parser.setListener(new MyTransformer(output));

            final CharArrayCharSequence charSequence = new CharArrayCharSequence(4096);
            final char[] buffer = charSequence.getChars();

            int len;
            while ((len = input.read(buffer,0, buffer.length)) > -1) {
                charSequence.setLength(len);
                parser.parse(charSequence);
            }
            parser.eoj();
        }
    }

    static class MyTransformer extends JsonEventPump {
        private final SimpleDateFormat sdf = new SimpleDateFormat();
        private boolean isTimestamp;

        MyTransformer(final Writer output) {
            super(new AppendableWriter<>(output));
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        }

        @Override
        public boolean onObjectMember(final CharSequence name) {
            isTimestamp = "timestamp_ms".contentEquals(name);
            return super.onObjectMember(name);
        }

        @Override
        public boolean onNumberValue(final JsonNumber number) {
            if (isTimestamp) {
                return super.onStringValue(sdf.format(new Date(number.mantissa())));
            }
            return super.onNumberValue(number);
        }
    }
}